如何根据 R 中另一个数据框中的两个同时满足的条件对数据框进行子集化?
How can I subset a dataframe based on two simultaneously fulfilled conditions in another dataframe in R?
这是我关于堆栈溢出的第一个问题,所以如果需要更多信息来回答这个问题,请告诉我。最近刚开始学R,还请大家耐心等待
我有一个数据框 Df1,我想 subset/filter 基于两个 同时 条件:
- 公司代码是否也出现在 Df2 中?
- 在这种情况下,两个数据帧的日期是否也相同?
我试过下面的代码
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
这是我关于堆栈溢出的第一个问题,所以如果需要更多信息来回答这个问题,请告诉我。最近刚开始学R,还请大家耐心等待
我有一个数据框 Df1,我想 subset/filter 基于两个 同时 条件:
- 公司代码是否也出现在 Df2 中?
- 在这种情况下,两个数据帧的日期是否也相同?
我试过下面的代码
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