如何筛选出特定列全部为na的数据

4

这里是一个样本数据集:

id <- c("Item1","Item2","Item3","Item4","Item5","Item6")
var1 <- c(2,3,NA,NA,5,6)
var2 <- c(NA,3,5,NA,5,NA)
var3 <- c(NA,3,4,NA,NA,6)
test <- data.frame(id, var1, var2, var3)

我希望过滤掉 var1、var2 和 var3 都是 na 的数据。我知道可以这样做:

test1 <- test %>% filter(!(is.na(var1) & is.na(var2) & is.na(var3)))
test1

     id var1 var2 var3
1 Item1    2   NA   NA
2 Item2    3    3    3
3 Item3   NA    5    4
4 Item5    5    5   NA
5 Item6    6   NA    6

有没有更好的方法来做这件事?


如果跨越所有列,您能否查看此操作是否有效 https://dev59.com/TGEh5IYBdhLWcg3wfjiq - StupidWolf
1
这个回答解决了你的问题吗?使用dplyr过滤data.frame中的完整案例(逐案例删除) - UseR10085
最佳的 data.table 方法是什么? - Andi
3个回答

5

如果筛选针对某些列,例如 var1:var3,则可以使用:

library(dplyr)

选项 1

test %>%
  filter(rowSums(across(var1:var3, ~ !is.na(.))) > 0)

选项二

test %>%
  filter_at(vars(var1:var3), any_vars(!is.na(.)))

选项三

test %>%
  rowwise() %>% 
  filter(sum(!is.na(c_across(var1:var3))) > 0) %>%
  ungroup()

输出

# # A tibble: 5 x 4
#   id     var1  var2  var3
#   <chr> <dbl> <dbl> <dbl>
# 1 Item1     2    NA    NA
# 2 Item2     3     3     3
# 3 Item3    NA     5     4
# 4 Item5     5     5    NA
# 5 Item6     6    NA     6

1
一个基于R语言的一行代码。
test[apply(test[-1], 1, function(x) any(!is.na(x))), ]
#     id var1 var2 var3
#1 Item1    2   NA   NA
#2 Item2    3    3    3
#3 Item3   NA    5    4
#5 Item5    5    5   NA
#6 Item6    6   NA    6

一行代码可能很难阅读,这里有一个分解版本的上面的代码。
定义一个辅助函数f
f <- function(x) any(!is.na(x))

现在,使用 MARGIN = 1,对函数执行行操作。保留html格式。
i <- apply(test[-1], 1, f)
i
#[1]  TRUE  TRUE  TRUE FALSE  TRUE  TRUE

只有 TRUE 索引值将成为最终结果的一部分。

test[i, ]
#
# Output omited, identical to above
#

0
你可以尝试使用这个基于R的方法:
#Base R solution
test[complete.cases(test),]

     id var1 var2 var3
2 Item2    3    3    3

1
这显然不能满足OP的要求。 - Darren Tsai

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接