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

时间:2021-02-19 10:08:15

标签: r dataframe filtering subset

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

我有一个数据框 Df1,我想根据两个同时条件对其进行子集/过滤:

  • 公司代码是否也存在于 Df2 中?
  • 在这种情况下,两个数据框的日期是否也相同?

我已经尝试了以下代码

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

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

举一个具体的例子(见下文;编辑:现在要求作为 dput 输出):它会期望在我的结果中 Df1 中没有第 4 行因为在 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")

如果您能在这里帮助我,我将不胜感激。希望这个例子能清楚地说明我的问题。

非常感谢!

2 个答案:

答案 0 :(得分:2)

另一种方式..


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

答案 1 :(得分:1)

您可以使用 paste CompanyCode 和 year value 在两者之间创建唯一键,并使用 %in% 仅保留那些存在 df2 的键。

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