Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/neo4j/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R 用NA'移除柱;仅限s和/或零_R_Na_Zero - Fatal编程技术网

R 用NA'移除柱;仅限s和/或零

R 用NA'移除柱;仅限s和/或零,r,na,zero,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 | |----|:--:|---:|--

我有一个样本数据集,看起来与下面的数据集类似:

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 |
| a  |  c |
|----|:--:|
| 1  | 98 |
| 5  | 67 |
| 56 | NA |
| 4  | 3  |
| 9  | 7  |
我需要删除所有具有以下内容的列:

1. NA's and Zeros
2. Only Zeros
3. Only NA's
因此,基于上述数据集,应删除b、d和e列。所以,我首先需要找出哪些列具有这样的条件,然后删除它们

我浏览了这个链接,但我不清楚解决方案。而且,它不能提供我想要的输出

最后的产出将是:


| 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 |
| 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
或者另一个选项是将所有0替换为
NA
,然后应用
is.NA

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

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

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

as.data.frame(过滤器(函数(x)!all(x==“NA”| x==“0”),{lapply(d,as.character)}))
使用
dplyr

库(dplyr)
d%>%
全部变异(如字符)%>%
选择(其中(colSums(abs(.),na.rm=T)!=0))

输出:

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

将NAs和0存储为字符串非常奇怪,但这就是问题所在

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

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

bad_column我们可以使用
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

我已经在我的真实数据集上尝试过了。我不知道为什么,但它不会删除同时包含NA和零的列。即使在上面的示例数据集中,它也不会删除列e。我能想到的另一种方法是用零替换所有NA,然后用全零删除列,但这似乎也不起作用。@hk2根据您的示例,我得到了预期的输出。可能是你用的早一点version@akrun我很抱歉。我做了编辑。它们是数字的,谢谢。我测试了你的数据,它似乎可以很好地返回预期的输出。这篇文章已经编辑过了。我已将它们更改为数字。如果所有列都是数字,则为真。但是,如果其中一些列的数据类型不同,例如字符和日期,则如何修改上述代码?@hk2请编辑您的数据集,并使其代表您的实际数据集