首页 > 解决方案 > 如何过滤掉特定列都在哪里

问题描述

这是一个示例数据集:

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

有没有更好的方法来做到这一点?

标签: rdplyr

解决方案


如果过滤集中在某些列上,例如var1:var3,您可以使用

library(dplyr)

选项1

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

选项 2

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

选项 3

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

推荐阅读