【问题标题】:How can I subset a dataframe based on two simultaneously fulfilled conditions in another dataframe in R?如何根据 R 中另一个数据帧中的两个同时满足的条件对数据帧进行子集化?
【发布时间】:2021-05-22 07:46:36
【问题描述】:

这是我关于堆栈溢出的第一个问题,所以如果需要更多信息来回答这个问题,请告诉我。我最近才开始学习 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))

子(实际输出):

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")

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

非常感谢!

【问题讨论】:

  • 请将您的输入数据提供为dput() 的输出,而不是图像。
  • 请发布您的预期输出

标签: r dataframe filtering subset


【解决方案1】:

另一种方式..


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

【讨论】:

    【解决方案2】:

    您可以pasteCompanyCode 和年份值在它们之间创建一个唯一键,并使用%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
    

    【讨论】:

    • 谢谢,效果很好(特别是因为我能够添加其他条件)。
    猜你喜欢
    • 1970-01-01
    • 2013-06-14
    • 2017-11-10
    • 1970-01-01
    • 1970-01-01
    • 2018-11-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多