在我的数据中,如果三列(V1、V2、V3)中的值是 12 和 NA 的组合(如第 2 行)或所有三列都等于 12(如第 5 行),我需要删除这些行。请注意,如果所有值都等于 NA(如第 3 行),它应该保留在数据中。
df <- data.frame(
"V1" = c(NA, NA, NA, 12, 12),
"V2" = c(55, NA, NA, 14, 12),
"V3" = c(21, 12, NA, NA, 12),
"V4" = c(NA, 32, NA, NA, NA),
"V5" = c(NA, NA, 18, NA, NA)
)
V1 V2 V3 V4 V5
1 NA 55 21 NA NA
2 NA NA 12 32 NA
3 NA NA NA NA 18
4 12 14 NA NA NA
5 12 12 12 NA NA
我想要以下结果:
V1 V2 V3 V4 V5
1 NA 55 21 NA NA
3 NA NA NA NA 18
4 12 14 NA NA NA
提前感谢您的帮助。
使用 Tidyverse 语法,保留所有行,其中从列 V1 到 V3 的至少一个条目与 NA 或 12 不同:
library(tidyverse)
df <- tibble(
"V1" = c(NA, NA, 76, 12),
"V2" = c(55, NA, NA, 14),
"V3" = c(21, 12, NA, NA),
"V4" = c(NA, 32, NA, NA),
"V5" = c(NA, NA, 12, NA)
)
df |>
filter(if_any(
V1:V3,
~ !(is.na(.x) | .x == 12)
))
#> # A tibble: 3 × 5
#> V1 V2 V3 V4 V5
#> <dbl> <dbl> <dbl> <dbl> <dbl>
#> 1 NA 55 21 NA NA
#> 2 76 NA NA NA 12
#> 3 12 14 NA NA NA
创建于 2023-03-03 与 reprex v2.0.2
更一般地说,要根据多列中的值对行进行子集化,请结合使用
filter()
和 if_all()
和 if_any()
助手。
首先设置一个
col
变量存储目标列名称。 NA
或 12
的记录总数应与 length
的 col
匹配。
col <- c("V1", "V2", "V3")
df[apply(df[, col], 1, \(x) sum((is.na(x) | x == 12), na.rm = T) != length(col)), ]
更新:要删除同时包含
12
和NA
或所有值等于12
的行,请使用以下代码:
df[apply(df[, col], 1, \(x) !((sum((is.na(x) | x == 12), na.rm = T) == length(col)) &
(sum(is.na(x)) >= 1 & sum(x == 12, na.rm = T) >= 1) |
sum(x == 12, na.rm = T) == length(col))), ]
V1 V2 V3 V4 V5
1 NA 55 21 NA NA
3 76 NA NA NA 12
4 12 14 NA NA NA
您可以在
filter()
中使用双重条件:
library(dplyr)
df %>%
filter(!if_all(V1:V3, ~ .x %in% c(12, NA)) | if_all(V1:V3, ~ is.na(.x)))
# V1 V2 V3 V4 V5
# 1 NA 55 21 NA NA
# 2 NA NA NA NA 18
# 3 12 14 NA NA NA