逻辑运算符:和表达喜欢的OR

Llo*_*mas 3 r

我有一个很难理解R为如何治疗AND和OR运算时,我使用filterdplyr.

这是一个例子来说明:

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)

有人可以解释我错过的东西吗?

sho*_*aco 6

这是布尔代数的问题.逻辑表达式!(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)

  • 对于那些感兴趣的人,这在命题逻辑中称为[De Morgan定律](https://en.wikipedia.org/wiki/De_Morgan%27s_laws) (2认同)