根据二进制和 NA 条件删除行

Remove rows based on binary & NA condition

假设我们在数据集 DF 中有三列:A、B 和 C。

A​​ 是二进制的,而 B 和 C 是有序的。

有时B和C是NA,有时在同一行,有时不。

现在,我想要的是在 A = 0 的条件下删除 B 或 C 为 NA 的行。如果 A = 1,则 B 或 C 是​​否为 NA 无关紧要。

执行此操作的 easiest/most 直接方法是什么?

我用 if else 试过了,但是因为 B 和 C 有 NA 值,我收到警告说它不是 TRUE/FALSE。

一个简单的基础 R 解决方案是

DF[DF$A == 1 | (DF$A != 1 & !is.na(DF$B)) | (DF$A != 1 & !is.na(DF$C)), ]

DF[ifelse(DF$A == 0, !is.na(DF$B) & !is.na(DF$C), TRUE), ]

这里是一个使用 tidyverse 的例子,特别是 dplyr::filter。构造正确的条件集很容易,我们希望在 A == 1!is.na(B)!is.na(C) 的位置保留行。我也 arrange by A 所以你可以看到没有 NAA == 0.

library(tidyverse)
set.seed(100)
tbl <- data.frame(
  A = sample(0:1, 20, replace = TRUE),
  B = sample(c(1, 2, NA), 20, replace = TRUE),
  C = sample(c(3, 4, NA), 20, replace = TRUE)
)

tbl %>%
  filter((A == 1) | (!is.na(B) & !is.na(C))) %>%
  arrange(A)
#>    A  B  C
#> 1  0  2  3
#> 2  0  2  4
#> 3  0  1  4
#> 4  0  1  3
#> 5  0  2  3
#> 6  0  1  3
#> 7  0  2  3
#> 8  1  2 NA
#> 9  1 NA NA
#> 10 1  2  3
#> 11 1  2  3
#> 12 1 NA  3
#> 13 1 NA  4
#> 14 1 NA  3
#> 15 1  1  3

reprex package (v0.2.0) 创建于 2018-05-10。