R 根据最大日期和最近日期选择列值

R 根据最大日期和最近日期选择列值,r,date,compare,R,Date,Compare,我有一个如下的数据集 Id BMI Date Case CaseDate 1331 28.2 2012-05-15 No NA 1331 26.4 2011-04-06 No NA 1331 29.37 2014-04-01 No NA 5074 30.02 2009-10-23 Yes 2014-08-06 5074 25.12 2011-07-15 Yes 2014-08-06 我想做的事

我有一个如下的数据集

Id    BMI    Date        Case   CaseDate 
1331  28.2   2012-05-15  No     NA
1331  26.4   2011-04-06  No     NA
1331  29.37  2014-04-01  No     NA
5074  30.02  2009-10-23  Yes    2014-08-06
5074  25.12  2011-07-15  Yes    2014-08-06
我想做的事情如下

Id    BMI    Date        Case   CaseDate 
1331  28.2   2012-05-15  No     NA
1331  26.4   2011-04-06  No     NA
1331  29.37  2014-04-01  No     NA
5074  30.02  2009-10-23  Yes    2014-08-06
5074  25.12  2011-07-15  Yes    2014-08-06
1) 对于
Case=No
的Id,选择最接近当前日期的BMI
(Sys.date())
,并将该值存储在新列中(
new\u BMI

2) 对于
Case=Yes
的Id,在
CaseDate
列中选择最接近日期的BMI,并将该值存储在新列中(
new\u BMI

最终输出如下所示

Id    BMI    Date        Case   CaseDate     New_BMI
1331  28.2   2012-05-15  No     NA           29.37
1331  26.4   2011-04-06  No     NA           29.37
1331  29.37  2014-04-01  No     NA           29.37
5074  30.02  2009-10-23  Yes    2014-08-06   25.12
5074  25.12  2011-07-15  Yes    2014-08-06   25.12
Id 1331的
New_BMI
值为29.37,因为这是最接近当前日期的值。Id 5074的
New_BMI
值为25.12,因为该值最接近
CaseDate
(2014-08-06)


非常感谢各位对如何计算这个新的BMI的任何帮助。

首先确保您有日期类对象

df$Date <- as.Date(df$Date)
df$CaseDate <- as.Date(df$CaseDate)
数据

df <- structure(list(Id = c(1331L, 1331L, 1331L, 5074L, 5074L), BMI = c(28.2, 
26.4, 29.37, 30.02, 25.12), Date = structure(c(4L, 2L, 5L, 1L, 
3L), .Label = c("2009-10-23", "2011-04-06", "2011-07-15", "2012-05-15", 
"2014-04-01"), class = "factor"), Case = structure(c(1L, 1L, 
1L, 2L, 2L), .Label = c("No", "Yes"), class = "factor"), CaseDate = structure(c(NA, 
NA, NA, 1L, 1L), .Label = "2014-08-06", class = "factor")), .Names = c("Id", 
"BMI", "Date", "Case", "CaseDate"), class = "data.frame", row.names = c(NA, 
-5L))

df我将第二个标准改为
BMI[which.max(CaseDate-Date)]
,效果非常好