当我使用 dplyr
中的 filter
时,我很难理解 R 是如何处理 AND 和 OR 运算符的。
这里有一个例子来说明:
library(dplyr)
xy <- data.frame(x=1:6, y=c("a", "b"), z= c(rep("d",3), rep("g",3)))
> xy
x y z
1 1 a d
2 2 b d
3 3 a d
4 4 b g
5 5 a g
6 6 b g
使用 filter
我想消除 x==1
和 z==d
的所有行。这会让我相信我想使用 AND 运算符:&
> filter(xy, x != 1 & z != "d")
x y z
1 4 b g
2 5 a g
3 6 b g
但这会删除所有具有 x==1
或 z==d
的行。更令人困惑的是,当我使用 OR 运算符时, |
我得到了想要的结果:
> filter(xy, x != 1 | z != "d")
x y z
1 2 b d
2 3 a d
3 4 b g
4 5 a g
5 6 b g
此外,这确实有效,但如果我在同一条件评估中将 ==
和 !=
串在一起,则不理想。
> filter(xy, !(x == 1 & z == "d"))
x y z
1 2 b d
2 3 a d
3 4 b g
4 5 a g
5 6 b g
有人可以解释我缺少什么吗?
最佳答案
这是一个 bool 代数的问题。逻辑表达式 !(x == 1 & z == d)
等价于 x != 1 | z != d
,就像-(x + y)
等价于-x - y
。消除括号,将所有 ==
更改为 !=
并将所有 &
更改为 |
,反之亦然。这导致了
!(x == 1 & z == "d")
和
不一样x != 1 & z != "d"
而是
x != 1 | z != "d"
关于r - 逻辑运算符 : AND acting liking OR,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47144866/