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

时间:2019-04-10 16:03:58

标签: r dplyr data.table

我有两个数据帧。

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

2 个答案:

答案 0 :(得分:3)

您可以使用modelBuilder.Entity<CompanyDescription>() .HasKey(cd => new { cd.CompanyID, cd.DescriptionID, cd.Language }); // <-- Here it is modelBuilder.Entity<CompanyDescription>() .HasOne(cd => cd.Company) .WithMany(c => c.CompanyDescriptions) .HasForeignKey(bc => bc.CompanyID); modelBuilder.Entity<CompanyDescription>() .HasOne(cd => cd.Description) .WithMany(c => c.CompanyDescriptions) .HasForeignKey(bc => new { bc.DescriptionID, bc.Language}); // <-- Here it is 包,通过将第二个数据帧连接到第一个数据帧并使用过滤器来执行此操作。如果列名相同,dplyr将在列名上添加.x和.y,因此您的代码应如下所示。

dplyr

答案 1 :(得分:2)

如果您的数据帧是数据表,则可以使用以下代码将两个表联接到ID的{​​{1}}和Date匹配的df1> = Date {1}},它将直接返回结果,而无需执行额外的过滤步骤。

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