如何删除只包含NAs的列?

我有一个data.frame包含一些具有所有NA值的列,我怎么能从data.frame中删除它们。

我可以使用该function吗?

na.omit(...) 

指定一些额外的参数?

一种做法:

 df[, colSums(is.na(df)) != nrow(df)] 

如果列中的NA数量等于行数,则它必须完全是NA。

或者类似地

 df[colSums(!is.na(df)) > 0] 

它看起来像你只想删除所有 NA的列,留下一些具有NA s的行的列。 我会这样做(但我相信有一个有效的向量化的soution:

 #set seed for reproducibility set.seed <- 103 df <- data.frame( id = 1:10 , nas = rep( NA , 10 ) , vals = sample( c( 1:3 , NA ) , 10 , repl = TRUE ) ) df # id nas vals # 1 1 NA NA # 2 2 NA 2 # 3 3 NA 1 # 4 4 NA 2 # 5 5 NA 2 # 6 6 NA 3 # 7 7 NA 2 # 8 8 NA 3 # 9 9 NA 3 # 10 10 NA 2 #Use this command to remove columns that are entirely NA values, it will elave columns where only some vlaues are NA df[ , ! apply( df , 2 , function(x) all(is.na(x)) ) ] # id vals # 1 1 NA # 2 2 2 # 3 3 1 # 4 4 2 # 5 5 2 # 6 6 3 # 7 7 2 # 8 8 3 # 9 9 3 # 10 10 2 

如果您发现自己想要删除具有任何NA值的列,则只需将上面的all命令更改为any

这是一个dplyr解决scheme:

 df %>% select_if(~sum(!is.na(.)) > 0) 

Filter另一个选项

 Filter(function(x) !all(is.na(x)), df) 

注:数据来自@Simon O'Hanlon的post。

另一个select是janitor套餐:

 df <- remove_empty_cols(df) 

https://github.com/sfirke/janitor