删除除一列之外的所有列都具有 NA 值的行?

nlp*_*ner 1 r dataframe dplyr

我有一个包含三列的日期框,其中一列有一个没有 NA 值的参与者 ID 变量,另外两列(目标变量)有一些分散的变量。我正在尝试使用此处解释的解决方案(删除除 2 列之外所有列均为 NA 的行)来删除两个目标变量都具有 NA 的行,但由于某种原因,我的实现似乎不加区别地删除所有 NA。

以下是未处理的 df 的示例:

ID A
1 ab 不适用
1 不适用 ab
1 不适用 不适用

这是我希望处理后的 df 的样子:

ID A
1 ab 不适用
1 不适用 ab

这是我用来尝试实现此目的的代码:

na_rows = df %>% 
  select(-"ID") %>% 
  is.na() %>% 
  rowSums() > 0

processeddf <- df %>% 
  filter(!na_rows)
Run Code Online (Sandbox Code Playgroud)

但是,此代码返回一个 df,它已删除所有包含 NA 的行。因此对于上面的示例,它将返回一个空的 df。我这里哪里出错了?我无法弄清楚我的逻辑错误发生在哪里。

akr*_*run 6

我们可以使用if_all in filter- 选择 a 到 b 列if_all,应用is.na(检查 NA),如果 a 和 b 都有 NA,则该行的输出将为 TRUE,否定 ( !) 转换 TRUE-> FALSE 和 FALSE->真的

library(dplyr)
df %>%
   filter(!if_all(a:b, is.na))
Run Code Online (Sandbox Code Playgroud)

-输出

ID    a    b
1  1   ab <NA>
2  1 <NA>   ab
Run Code Online (Sandbox Code Playgroud)

!或者我们可以使用complete.caseswith来代替否定 ( )if_any

df %>% 
  filter(if_any(a:b, complete.cases))
  ID    a    b
1  1   ab <NA>
2  1 <NA>   ab
Run Code Online (Sandbox Code Playgroud)

关于OP代码中的问题,逻辑是通过查看是否存在至少一个> 0对于所有行都成立的NA()来创建的。相反,它应该全部为NA,然后否定

na_rows <- df %>% 
  select(-"ID") %>% 
  is.na() %>% 
  {rowSums(.) == ncol(.)}
Run Code Online (Sandbox Code Playgroud)

数据

df <- structure(list(ID = c(1L, 1L, 1L), a = c("ab", NA, NA), b = c(NA, 
"ab", NA)), class = "data.frame", row.names = c(NA, -3L))
Run Code Online (Sandbox Code Playgroud)