首页 > 解决方案 > 选择列,不包括一些都是 NA

问题描述

假设我有这个数据框

df <- data.frame(keep = c(1, NA, 2),
                   also_want = c(NA, NA, NA),
                   maybe = c(1, 2, NA),
                   maybe_2 = c(NA, NA, NA))

编辑:在实际的数据框中,我想保留很多列,因此将它们全部拼写出来是不可行的。这些列是所有不以 开头的列maybemaybe相反,这些列确实有一个共同的命名maybe,例如maybe_1等,可以与grepor一起使用stringr::str_detect

我想选择keep, 和also_want。我还想要任何maybe具有以下值的列NA

desired_df
  keep also_want maybe
1    1        NA     1
2   NA        NA     2
3    2        NA    NA

我可以select_if用来获取所有具有非NA值的列,但后来我输了also_want

library(dplyr)
df %>%   
  select_if(~sum(!is.na(.)) > 0)
  keep maybe
1    1     1
2   NA     2
3    2    NA

想法?

标签: rdataframeselectdplyr

解决方案


使用dplyr1.0.0,您可以where在语句中使用该函数select来测试您的变量必须满足的条件,但首先您指定您还想保留的变量。

编辑

我插入了一个条件,即只有"maybe"变量必须包含除NA;之外的值。之前,我们选择不以 . 开头的每一列"maybe"

df %>% 
  select(!starts_with("maybe"), starts_with("maybe") & where(~sum(!is.na(.)) > 0))

输出

#   keep also_want maybe
# 1    1        NA     1
# 2   NA        NA     2
# 3    2        NA    NA

推荐阅读