根据二进制和 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
所以你可以看到没有 NA
行 A == 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。
假设我们在数据集 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
所以你可以看到没有 NA
行 A == 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。