【发布时间】:2019-03-29 18:52:42
【问题描述】:
我在使用 dplyr 连接数据帧时遇到了一些问题,我想忽略 NA。
我拥有的数据很大,但简化版本如下:
id <- c("id1", "id2", "id3", "id4")
A <- c("E", "F", "G", NA)
B <- c("T", NA, "N", "T")
C <- c(NA, "T", "U", NA)
df <- data.frame(A, B, C)
id A B C
1 id1 E T NA
2 id2 F NA T
3 id3 G N U
4 id4 NA T NA
我有一个想与 df 匹配的条目,例如:
df2 <- data.frame(A = "E", B = "T", C = "M")
A B C
1 E T M
因此,我想从 df 中获取与 df2 匹配的所有行,但应该忽略 NA。所以结果应该是这样的:
id A B C
1 id1 E T NA
2 id4 NA T NA
我试图用 semi_join 来做这件事,但到目前为止没有用:
result <- df %>%
group_by(n = seq(n())) %>%
do(modify_if(., is.na, ~NULL) %>%
semi_join(df2, by = c("A", "B", "C"))) %>%
ungroup %>%
select(-n)
结果:
Error: `by` can't contain join column `C` which is missing from LHS
Call `rlang::last_error()` to see a backtrace
谁知道答案?
【问题讨论】:
-
你能解释一下你想要的结果吗?为什么行
E T NA和NA T NA会被返回? -
df2中的 B 应该是“T”而不是“M”吗? -
正如其他人所说,您的示例看起来有点混乱。在任何情况下,
semi_join都不是答案,因为它与其他 dplyr 加入工作的方式相同。您可能只想制作每个组合(笛卡尔积),然后过滤至少一对列或没有不匹配的列。 -
@thc 你是对的,对不起
-
@svenhalvorson 抱歉,我不明白您的意思,您能否提供链接或更多信息?