仅删除具有 NA 的 and/or 零的列
Remove columns with NA's and/or Zeros Only
我有一个样本数据集,看起来类似于下面的数据集:
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 列应该被剔除。所以,我首先需要找出哪些列有这样的条件,然后删除它们。
我经历了这个 link Remove the columns with the colsums=0 但我不清楚解决方案。此外,它没有为我提供所需的输出。
最终输出将是:
| a | c |
|----|:--:|
| 1 | 98 |
| 5 | 67 |
| 56 | NA |
| 4 | 3 |
| 9 | 7 |
一种选择是根据每列中 NA
或 0 个元素的数量 colSums
创建一个逻辑向量
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
或者另一种选择是 replace
所有 0 到 NA
然后应用 is.na
d[colSums(!is.na(replace(d, d == 0, NA))) > 0]
或更紧凑 na_if
d[colSums(!is.na(na_if(d, 0))) > 0]
在 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
将 NA 和 0 存储为字符串非常奇怪,但是你去...
bad_column <- function(z) {
all(z %in% c("NA", "0"))
}
d[, !sapply(d, bad_column), drop = FALSE]
我们可以按列使用 apply
并删除具有 all
、NA
或 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
我有一个样本数据集,看起来类似于下面的数据集:
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 列应该被剔除。所以,我首先需要找出哪些列有这样的条件,然后删除它们。
我经历了这个 link Remove the columns with the colsums=0 但我不清楚解决方案。此外,它没有为我提供所需的输出。
最终输出将是:
| a | c |
|----|:--:|
| 1 | 98 |
| 5 | 67 |
| 56 | NA |
| 4 | 3 |
| 9 | 7 |
一种选择是根据每列中 NA
或 0 个元素的数量 colSums
创建一个逻辑向量
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
或者另一种选择是 replace
所有 0 到 NA
然后应用 is.na
d[colSums(!is.na(replace(d, d == 0, NA))) > 0]
或更紧凑 na_if
d[colSums(!is.na(na_if(d, 0))) > 0]
在 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
将 NA 和 0 存储为字符串非常奇怪,但是你去...
bad_column <- function(z) {
all(z %in% c("NA", "0"))
}
d[, !sapply(d, bad_column), drop = FALSE]
我们可以按列使用 apply
并删除具有 all
、NA
或 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