繁体   English   中英

如何通过另一个数据帧中的两个条件子集一个数据帧

[英]how to subset a data frame by two conditions in another data frame

我有两个数据框。

ID            Date
 1      1999-01-01
 1      2000-01-01
 1      2001-01-01
 2      1999-01-01
 2      2000-01-01
 3      1998-01-01
 3      1999-01-01
 4      2000-01-01

ID            Date
 1      1999-03-01
 2      2000-01-01
 3      1998-01-01

我的目标是在第二个数据帧中按ID子集第一个数据帧。 然后,在ID的每个子组中,我只选择不早于第二个数据框中的日期的日期。 例如,我仅选择ID 1的第二行和第三行,因为它们的日期不早于第二个数据帧中的1999-03-01。 我想要的结果是

ID            Date
 1      2000-01-01
 1      2001-01-01
 2      2000-01-01
 3      1998-01-01
 3      1999-01-01

您可以使用dplyr软件包来实现此目的,方法是将第二个数据帧连接到第一个数据帧并使用过滤器。 如果列名相同,则dplyr将在列名上添加.x和.y,因此您的代码应如下所示。

 df1 %>% inner_join(df2, by = 'ID') %>% filter(Date.x >= Date.y)

如果您的数据帧是数据表,则可以使用下面的代码在匹配ID s和Date df1 > = Date df2上连接两个表,这将直接返回结果,而无需执行额外的过滤步骤。

library(data.table)

df1[df2, on = .(ID, Date >= Date), .(ID, Date = x.Date)]

#    ID       Date
# 1:  1 2000-01-01
# 2:  1 2001-01-01
# 3:  2 2000-01-01
# 4:  3 1998-01-01
# 5:  3 1999-01-01

使用数据

df1 <- fread('
ID            Date
 1      1999-01-01
 1      2000-01-01
 1      2001-01-01
 2      1999-01-01
 2      2000-01-01
 3      1998-01-01
 3      1999-01-01
 4      2000-01-01
')
df1[, Date := as.Date(Date)]

df2 <- fread('
ID            Date
 1      1999-03-01
 2      2000-01-01
 3      1998-01-01
')
df2[, Date := as.Date(Date)]

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM