在存在缺失数据的情况下使用 pmin() 在 r 中查找最早日期
Find earliest date in r with pmin() in the presence of missing data
我目前正在尝试创建一个新变量以 return 跨两个变量的最早日期。我使用了 pmin()
函数,并且在 两个 变量中都有可用日期的情况下没有问题。在 一个变量 缺少日期但另一个变量缺少日期的情况下,理想情况下我希望代码 return 后一个变量中的日期。相反,NA 是 returned,我还没有想出如何解决这个问题。
我的代码如下:
df = data.frame(ID = c(1001, 1002, 1003, 1004, 1005),
disease_code = c('1', '1' ,'0', '1','0'),
Date_of_diagnosis_1 = c(NA,'13/06/1997',NA,'18/02/2005',NA),
Date_of_diagnosis_2 = c('12/06/1998',NA,NA,'18/09/2001',NA))
df$Date_of_diagnosis_1 <- as.Date(df$Date_of_diagnosis_1, format="%d/%m/%Y")
df$Date_of_diagnosis_2 <- as.Date(df$Date_of_diagnosis_2, format="%d/%m/%Y")
df <- transform(df, earliest_date = pmin(Date_of_diagnosis_1,
Date_of_diagnosis_2, na.rm=TRUE))
更新:na.rm 位于用户 Duck 和 Wimpel 强调的错误位置。上面的代码现在可以正常工作了。
这是data.table
事情的方式
library( data.table )
#make it a data.table
setDT(df)
#set dates as real date
cols = grep( "^Date", names(df), value = TRUE )
df[, (cols) := lapply( .SD, as.Date, format = "%d/%m/%Y"), .SDcols = cols]
#find minumum date in date-columns
df[, earliest_date := do.call( pmin, c( .SD, list( na.rm = TRUE ) ) ), .SDcols = cols ]
# ID disease_code Date_of_diagnosis_1 Date_of_diagnosis_2 earliest_date
# 1: 1001 1 <NA> 1998-06-12 1998-06-12
# 2: 1002 1 1997-06-13 <NA> 1997-06-13
# 3: 1003 0 <NA> <NA> <NA>
# 4: 1004 1 <NA> 2001-09-18 2001-09-18
# 5: 1005 0 <NA> <NA> <NA>
我目前正在尝试创建一个新变量以 return 跨两个变量的最早日期。我使用了 pmin()
函数,并且在 两个 变量中都有可用日期的情况下没有问题。在 一个变量 缺少日期但另一个变量缺少日期的情况下,理想情况下我希望代码 return 后一个变量中的日期。相反,NA 是 returned,我还没有想出如何解决这个问题。
我的代码如下:
df = data.frame(ID = c(1001, 1002, 1003, 1004, 1005),
disease_code = c('1', '1' ,'0', '1','0'),
Date_of_diagnosis_1 = c(NA,'13/06/1997',NA,'18/02/2005',NA),
Date_of_diagnosis_2 = c('12/06/1998',NA,NA,'18/09/2001',NA))
df$Date_of_diagnosis_1 <- as.Date(df$Date_of_diagnosis_1, format="%d/%m/%Y")
df$Date_of_diagnosis_2 <- as.Date(df$Date_of_diagnosis_2, format="%d/%m/%Y")
df <- transform(df, earliest_date = pmin(Date_of_diagnosis_1,
Date_of_diagnosis_2, na.rm=TRUE))
更新:na.rm 位于用户 Duck 和 Wimpel 强调的错误位置。上面的代码现在可以正常工作了。
这是data.table
事情的方式
library( data.table )
#make it a data.table
setDT(df)
#set dates as real date
cols = grep( "^Date", names(df), value = TRUE )
df[, (cols) := lapply( .SD, as.Date, format = "%d/%m/%Y"), .SDcols = cols]
#find minumum date in date-columns
df[, earliest_date := do.call( pmin, c( .SD, list( na.rm = TRUE ) ) ), .SDcols = cols ]
# ID disease_code Date_of_diagnosis_1 Date_of_diagnosis_2 earliest_date
# 1: 1001 1 <NA> 1998-06-12 1998-06-12
# 2: 1002 1 1997-06-13 <NA> 1997-06-13
# 3: 1003 0 <NA> <NA> <NA>
# 4: 1004 1 <NA> 2001-09-18 2001-09-18
# 5: 1005 0 <NA> <NA> <NA>