我有两个数据帧。
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
答案 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