r - 加入数据但忽略缺失值

标签 r dplyr na semi-join

我在使用 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

谁知道答案?

最佳答案

这是一个混合了 tidyverse 和 base R 的解决方案。我认为这很清楚,但我对并非完全人为设计的纯 tidyverse 实现感兴趣。

想法是首先展开 dfdf2 中的所有条目,然后使用循环过滤所有列。

数据:

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(id, A, B, C, stringsAsFactors = F) # Make sure to use strings not factors
df2 <- data.frame(A = "E", B = "T", C = "M", stringsAsFactors = F)

代码:

library(tidyr)
results <- crossing(df, df2)
select_columns <- c("A", "B", "C")
for(col in select_columns) {
  keep <- is.na(results[[col]]) | results[[col]] == results[[paste0(col, 1)]]
  results <- results[keep,, drop=F]
}
results <- results %>% dplyr::select(id, A:C) %>% distinct
results

   id    A B    C
1 id1    E T <NA>
2 id4 <NA> T <NA>

关于r - 加入数据但忽略缺失值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55423897/

相关文章:

sql - 为什么我的日期字段从 SQL 数据库作为 double 返回到 R 中

r - 合并 tibble 中的行

r - 将 dplyr 中的 get(paste0()) 对象解析为 Shiny 应用程序

r - 在 R 中向后搜索向量/数据表

r - 按顺序更新 data.table 中的行

r - 如何仅向外缓冲一组具有公共(public)边的多边形(从边缘,而不是内部 "frontiers")

r - 有没有办法让 merge.xts 保持名称不变?

r - 如何按包含特殊符号 R 的名称对列进行排序

r - 基于 R 中的日期列使用连续日期扩展数据框

r - 数据框选定列中包含 NA(缺失)值的行子集