子集R数据帧基于组级值

时间:2016-06-30 05:48:06

标签: r

我有一个带ID的数据框(df1),日期按升序排序(1)ID& (2)日期:

ID____Date
1_____1990-01-01
1_____1991-01-01
1_____1992-01-01
1_____1993-01-01
2_____1990-01-01
2_____1991-01-01
3_____1990-01-01
3_____1991-01-01
3_____1992-01-01

我想根据以下数据框(df2)中的组级别值对上述数据框进行子集化:

ID____Date
1_____1993-01-01
2_____1990-01-01
3_____1991-01-01

子设置条件:在df1中选择特定ID的所有行,其日期小于或等于(<=df2中相应ID的日期。

在上面的例子中,所需的输出是:

ID____Date
1_____1991-01-01
1_____1992-01-01
1_____1993-01-01
2_____1990-01-01
3_____1990-01-01
3_____1991-01-01

2 个答案:

答案 0 :(得分:1)

我们可以使用data.table。将'data.frame'转换为'data.table'(setDT(df1)),使用'df2'on'ID'列加入,将'Date'小于或等于'i.Date',并将(:=)'i.Date'分配给NULL。

library(data.table)
setDT(df1)[df2, on = 'ID'][Date <= i.Date][, i.Date := NULL]

或者这可以一步完成

setDT(df1)[df2, .SD[Date <= i.Date], on = 'ID', by = .EACHI]
#   ID       Date
#1:  1 1990-01-01
#2:  1 1991-01-01
#3:  1 1992-01-01
#4:  1 1993-01-01
#5:  2 1990-01-01
#6:  3 1990-01-01
#7:  3 1991-01-01

或者

setDT(df1)[df2, .SD[Date <= i.Date] ,on = 'ID']

我们也可以使用base R

执行此操作
df1[df1$Date <= df2$Date[match(df1$ID, df2$ID)],]
#  ID       Date
#1  1 1990-01-01
#2  1 1991-01-01
#3  1 1992-01-01
#4  1 1993-01-01
#5  2 1990-01-01
#7  3 1990-01-01
#8  3 1991-01-01

答案 1 :(得分:1)

也可以sqldf完成:

library(sqldf)
sqldf("select a.* from df1 a, df2 b where a.Date <= b.Date AND a.ID = b.ID" )