如果r中所有值均为NA或0,则删除Column

Amo*_*oso 0 r dataframe

有谁知道如何删除完全由NA或零组成的列?

例如,给定这样的数据框:

  rv    X1   X2    X3  X4 
1 M     0    110   0   1
2 J     70   200   0   3
3 J     NA   115   NA  4
4 M     65   110   0   9
5 J     70   200   NA  3
6 J     64   115   NA  8
Run Code Online (Sandbox Code Playgroud)

我只想要rv,X1,X2和X4列。

akr*_*run 6

有了base R,我们可以做到

Filter(function(x) !all(is.na(x)|x == 0), df)
#  rv X1  X2 X4
#1  M  0 110  1
#2  J 70 200  3
#3  J NA 115  4
#4  M 65 110  9
#5  J 70 200  3
#6  J 64 115  8
Run Code Online (Sandbox Code Playgroud)

或使用 colSums

df[!!colSums(replace(df, is.na(df), 0)!= 0)]
Run Code Online (Sandbox Code Playgroud)

sapply用于创建逻辑向量

df[!sapply(df, function(x) all(is.na(x)|x == 0))]
Run Code Online (Sandbox Code Playgroud)


Ron*_*hah 5

多种方法来做到这一点

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

#  rv X1  X2 X4
#1  M  0 110  1
#2  J 70 200  3
#3  J NA 115  4
#4  M 65 110  9
#5  J 70 200  3
#6  J 64 115  8
Run Code Online (Sandbox Code Playgroud)

使用 apply

df[!apply(is.na(df) | df == 0, 2, all)]
Run Code Online (Sandbox Code Playgroud)

或使用 dplyr

library(dplyr)
df %>%  select_if(~!all(is.na(.) | . == 0))
Run Code Online (Sandbox Code Playgroud)