我有一个带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
答案 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" )