选择列,不包括一些全为NA的列

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了选择列,不包括一些全为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))

编辑。 在实际的数据框架中,有很多列我想保留,所以把它们都写出来是不可行的。这些列是所有不是以 maybe. 该 maybe 列,而是有一个共同的命名,如 maybe, maybe_1 等能与 grepstringr::str_detect

我想选择 keepalso_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

有什么想法?

答案

随着 dplyr 1.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
另一答案

按照你的意见,在Base-R中我们可以使用

df[,!apply(
    rbind(
        grepl("maybe",colnames(df)),
        !apply(df, 2, function(x) !all(is.na(x)))
    )
,2,all)]

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

或者如果你喜欢在1行上看到同样的代码。

df[,!apply(rbind(grepl("maybe",colnames(df)),!apply(df, 2, function(x) !all(is.na(x)))),2,all)]
另一答案

我最终想出了这个办法 使用 str_detect 选择所有非maybe 列,然后用单行本在 sapply 同时选择任何其他列(即任何 maybe 列),具有非NA 价值。

library(dplyr)
library(stringr)
df %>%
  select_if(stringr::str_detect(names(.), "maybe", negate = TRUE) |
              sapply(., function(x) 
                sum(!is.na(x))
               > 0))
  keep also_want maybe
1    1        NA     1
2   NA        NA     2
3    2        NA    NA

以上是关于选择列,不包括一些全为NA的列的主要内容,如果未能解决你的问题,请参考以下文章

不包括特定列的数据框列切片

VBA-如何选择具有值的列单元格

数据表选择产生不正确的列连接

选择列表中的列无效

转换后 Spark Dataframe 选择列

R语言 -- 删除 dataFrame/matrix 中含有NA或全为NA的行或列