我有2个数据帧,如下所述:
df1 <- data.frame(ID=c(1,1,1,2,3,4,4), actual.date=c('10/01/1996','10/02/1996','5/01/2002','7/01/1999','9/01/2005','5/01/2006','2/03/2003'),
val=c(5,10,15,20,25,30,35)
dcis <- grep('date$',names(df1))
df1[dcis] <- lapply(df1[dcis],as.Date,'%m/%d/%Y')
df1
df2 <- data.frame(ID=c(1,1,1,2,3,4,4,4), before.date=c('10/1/1996','1/1/1998','1/1/2000','1/1/2001','1/1/2001','1/1/2001','10/1/2004','10/3/2004'), after.date=c('12/1/1996','9/30/2003','12/31/2004','3/31/2006','9/30/2006','9/30/2005','12/30/2004','11/28/2004'))
dcis <- grep('date$',names(df2))
df2[dcis] <- lapply(df2[dcis],as.Date,'%m/%d/%Y')
df2
需求->我将从df2
的每一行开始,看看df1
的行位于df2
的行中指定的日期范围内(包括范围)(按ID分组)。
例如:对于df2
中的第一行,df1
中有2行(第一和第二),其ID = 1,并且位于df2
第一行的日期范围内。在最终输出中,我将求和5 + 10(来自“ val”列),并置于df2
的第一行。
我们可以在data.table
中使用非等分联接
library(data.table)
val1 <- setDT(df1)[df2, sum(val), on = .(ID, actual.date >= before.date,
actual.date <= after.date), by = .EACHI]$V1
df2$val <- val1
df2$val
#[1] 15 15 15 NA 25 35 NA NA
我不确定这是否是您的追求。这是基本的R解决方案
df2$res <- apply(df2,1, function(x) sum(df1$val[df1$ID == x["ID"]
& df1$actual.date>= x["before.date"]
& df1$actual.date<= x["after.date"]]))
诸如此类
> df2
ID before.date after.date res
1 1 1996-10-01 1996-12-01 15
2 1 1998-01-01 2003-09-30 15
3 1 2000-01-01 2004-12-31 15
4 2 2001-01-01 2006-03-31 0
5 3 2001-01-01 2006-09-30 25
6 4 2001-01-01 2005-09-30 35
7 4 2004-10-01 2004-12-30 0
8 4 2004-10-03 2004-11-28 0