我有一个很难理解R为如何治疗AND和OR运算时,我使用filter的dplyr.
这是一个例子来说明:
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
Run Code Online (Sandbox Code Playgroud)
使用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
Run Code Online (Sandbox Code Playgroud)
但这会删除所有具有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
Run Code Online (Sandbox Code Playgroud)
此外,这样做的工作,但不是理想的,如果我在一起串==,并!=在同一条件评价.
> 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
Run Code Online (Sandbox Code Playgroud)
有人可以解释我错过的东西吗?
这是布尔代数的问题.逻辑表达式!(x == 1 & z == d)等同于x != 1 | z != d,-(x + y)等同于-x - y.消除括号,您将全部更改==为!=全部&,|反之亦然.这导致了这样的事实
!(x == 1 & z == "d")
Run Code Online (Sandbox Code Playgroud)
是不一样的
x != 1 & z != "d"
Run Code Online (Sandbox Code Playgroud)
反而
x != 1 | z != "d"
Run Code Online (Sandbox Code Playgroud)