选择列,不包括一些全为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
等能与 grep
或 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
有什么想法?
答案
随着 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的列的主要内容,如果未能解决你的问题,请参考以下文章