根据日期从一个数据框中查找所有行,并查看R中其他数据框中的日期范围

问题描述 投票:0回答:1

我有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的第一行。

r
1个回答
0
投票

我们可以在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

0
投票

我不确定这是否是您的追求。这是基本的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
© www.soinside.com 2019 - 2024. All rights reserved.