这是我关于堆栈溢出的第一个问题,所以请告诉我是否需要更多信息来回答这个问题。我最近才开始学习 R,所以请您耐心等待。
我有一个数据框 Df1,我想根据两个同时条件对其进行子集/过滤:
我已经尝试了以下代码
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")
如果您能在这里帮助我,我将不胜感激。希望这个例子能清楚地说明我的问题。
非常感谢!
答案 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