过滤器的否定在 R

问题描述

[数据集]

X Y Z
4.98 不适用 不适用
5.28 不适用 3.21
5.12 5.14 3.16
5.09 5.12 3.18
0 0 7.12
0 0 不适用
d %>% filter(x==0 | y==0 | z==0 | is.na(x) | is.na(y) | is.na(z))

上面的 R 代码给了我正确的结果,它对数据集进行了筛选,并在 x、y 或 z 中的任何一个中显示带有 0 或 NA 的所有内容,如下所示

X Y Z
4.98 不适用 不适用
5.28 不适用 3.21
0 0 7.12
0 0 不适用

但是当我将条件反转为否定时,它显示了所有内容。

d %>% filter(x!=0 | y!=0 | z!=0 | !is.na(x) | !is.na(y) | !is.na(z))

预期的结果是

X Y Z
5.12 5.14 3.16
5.09 5.12 3.18

但是我收到了整个数据集

你能告诉我我犯了什么错误吗?

解决方法

我认为这可能是逻辑问题而不是 R 问题。如果您用 or 替换您的 and 语句,那么我认为您将获得预期的结果以及对原始语句的否定。换句话说,d %>% filter(x!=0 & y!=0 & z!=0 & !is.na(x) & !is.na(y) & !is.na(z))

,

要反转条件,您可以在原始条件中添加 !

library(dplyr)

d %>% filter(!(x==0 | y==0 | z==0 | is.na(x) | is.na(y) | is.na(z)))

#     x    y    z
#1 5.12 5.14 3.16
#2 5.09 5.12 3.18

数据

d <- structure(list(x = c(4.98,5.28,5.12,5.09,0),y = c(NA,NA,5.14,z = c(NA,3.21,3.16,3.18,7.12,NA)),row.names = c(NA,-6L),class = "data.frame")

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...