如何根据 R 中另一个数据框中的两个同时满足的条件对数据框进行子集化?

How can I subset a dataframe based on two simultaneously fulfilled conditions in another dataframe in R?

这是我关于堆栈溢出的第一个问题,所以如果需要更多信息来回答这个问题,请告诉我。最近刚开始学R,还请大家耐心等待

我有一个数据框 Df1,我想 subset/filter 基于两个 同时 条件:

我试过下面的代码

Sub <- subset(Df1, Df1$CompanyCode %in% Df2$CompanyCode & year(Df1$Date) %in% Df2$Year)

我想我知道问题出在哪里,但我不知道如何解决。我认为上面的公式会单独检查“%in%”条件,因此在许多情况下 returns。

举一个具体的例子(见下文;编辑:现在要求作为 dput 输出):预计没有第 4 行 in Df1 in my result 因为在 Df2 中没有匹配的大小写。但是,它是结果子集的一部分。我猜是因为它可以找到公司代码和日期 单独 的匹配项,即它可以在 Df 中找到公司“B”,并且可以在 Df2 中找到 2016 年。但是,这不是我想要的,因为没有完美的匹配,同时满足这两个条件

Df1(输入 1):

structure(list(CompanyCode = c("A", "A", "B", "B", "C", "D"), 
    Date = structure(c(16800, 17166, 16800, 17166, 16800, 17166
    ), class = "Date")), row.names = c(NA, -6L), class = "data.frame")

Df2(输入 2):

structure(list(CompanyCode = c("A", "A", "B", "C", "D"), Year = c(2015L, 
2016L, 2015L, 2015L, 2016L)), class = "data.frame", row.names = c(NA, 
-5L))

Sub(实际输出):

structure(list(CompanyCode = c("A", "A", "B", "B", "C", "D"), 
    Date = structure(c(16800, 17166, 16800, 17166, 16800, 17166
    ), class = "Date")), row.names = c(NA, 6L), class = "data.frame")

ExpectedSub(预期输出):

structure(list(CompanyCode = c("A", "A", "B", "C", "D"), Date = structure(c(16800, 
17166, 16800, 16800, 17166), class = "Date")), row.names = c(NA, 
-5L), class = "data.frame")

如果你能帮助我,我将不胜感激。希望这个例子能说明我的问题。

非常感谢!

您可以 paste CompanyCode 和年份值在两者之间创建唯一键,并使用 %in% 仅保留存在 df2.[=15 的那些键=]

result <- subset(df1, paste(CompanyCode, format(Date, '%Y')) %in% 
                      paste(df2$CompanyCode, df2$Year))
result

#  CompanyCode       Date
#1           A 2015-12-31
#2           A 2016-12-31
#3           B 2015-12-31
#5           C 2015-12-31

还有一种方法..


library(dplyr)
library(lubridate)
df1 %>% mutate(Year = year(as.Date(Date))) %>%
  right_join(df2, by = c("CompanyCode" = "CompanyCode", "Year" = "Year"))

  CompanyCode       Date Year
1           A 2015-12-31 2015
2           A 2016-12-31 2016
3           B 2015-12-31 2015
4           C 2015-12-31 2015
5           D 2016-12-31 2016