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

时间:2019-09-24 20:20:05

标签: r na zero

我有一个样本数据集,其外观类似于以下内容:

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))

应为:


| 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 |

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

1. NA's and Zeros
2. Only Zeros
3. Only NA's

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

我浏览了此链接Remove the columns with the colsums=0,但不清楚该解决方案。另外,它也无法提供所需的输出。

最终输出将是:

| a  |  c |
|----|:--:|
| 1  | 98 |
| 5  | 67 |
| 56 | NA |
| 4  | 3  |
| 9  | 7  |

4 个答案:

答案 0 :(得分:3)

一种选择是根据每列中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

或者另一种选择是将所有0 replace NA,然后应用is.na

d[colSums(!is.na(replace(d, d == 0, NA))) > 0]

或更紧凑地使用na_if

d[colSums(!is.na(na_if(d, 0))) > 0]

答案 1 :(得分:1)

base中并假设我们具有不同类型的列:

as.data.frame(Filter(function(x) !all(x=="NA" | x == "0"), {lapply(d, as.character)}))

使用dplyr

library(dplyr)

d %>% 
  mutate_all(as.character) %>% 
  select(which(colSums(abs(.), na.rm = T) != 0))

输出:

#>    a  c
#> 1  1 98
#> 2  5 67
#> 3 56 NA
#> 4  4  3
#> 5  9  7

答案 2 :(得分:1)

将NA和0存储为字符串非常奇怪,但是您可以...

bad_column <- function(z) {
  all(z %in% c("NA", "0"))
}

d[, !sapply(d, bad_column), drop = FALSE]

答案 3 :(得分:1)

我们可以逐列使用apply并删除具有allNA或0的列。

d[!apply(d == 0 | is.na(d), 2, all)]

#   a  c
#1  1 98
#2  5 67
#3 56 NA
#4  4  3
#5  9  7
相关问题