我有一个包含三列的日期框,其中一列有一个没有 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。我这里哪里出错了?我无法弄清楚我的逻辑错误发生在哪里。
我们可以使用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)
| 归档时间: |
|
| 查看次数: |
2760 次 |
| 最近记录: |