仅删除带有 NA 和/或零的列

hk2*_*hk2 5 r subset dataframe na

我有一个示例数据集,看起来类似于下面的数据集:

d= data.frame(a = c(1,5,56,4,9), 
              b = c(0,0,NA,0,NA), 
              c = c(98,67,NA,3,7), 
              d = c(0,0,0,0,0), 
              e = c(NA,NA,NA,NA,NA))
Run Code Online (Sandbox Code Playgroud)

这将是:


| a  |  b |  c | d | e  |
|----|:--:|---:|---|----|
| 1  |  0 | 98 | 0 | NA |
| 5  |  0 | 67 | 0 | NA |
| 56 | NA | NA | 0 | NA |
| 4  | 0  | 3  | 0 | NA |
| 9  | NA | 7  | 0 | NA |
Run Code Online (Sandbox Code Playgroud)

我需要删除所有具有以下内容的列:

1. NA's and Zeros
2. Only Zeros
3. Only NA's
Run Code Online (Sandbox Code Playgroud)

因此,根据上述数据集,应删除 b、d 和 e 列。所以,我首先需要找出哪些列有这样的条件,然后将其删除。

我浏览了此链接删除带有 colsums=0 的列,但我不清楚解决方案。此外,它没有为我提供所需的输出。

最终输出将是:

| a  |  c |
|----|:--:|
| 1  | 98 |
| 5  | 67 |
| 56 | NA |
| 4  | 3  |
| 9  | 7  |
Run Code Online (Sandbox Code Playgroud)

akr*_*run 4

一种选择是根据每列中元素colSums的数量或 0 个元素创建一个逻辑向量NA

d[!colSums(is.na(d)|d ==0) == nrow(d)]
#  a    c
#1  1   98
#2  5   67
#3 56   NA
#4  4    3
#5  9    7
Run Code Online (Sandbox Code Playgroud)

或者另一种选择是replace全部 0NA然后应用is.na

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

或者更紧凑地使用na_if

d[colSums(!is.na(na_if(d, 0))) > 0]
Run Code Online (Sandbox Code Playgroud)