r - 逻辑运算符 : AND acting liking OR

标签 r

当我使用 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/

相关文章:

r - 使用 map 和 pluck 从嵌套列表中获取值

ruby - 如何在 R 中复制 Ruby 的 StringScanner 的一些功能?

r - Armadillo 中的合并功能

r - 在构面的第一个情节中的位置图例

r - 数据框的 fiddle 图

r - 使用 data.table 中的列名选择多个列范围

r - 如何使用函数参数设置列名

R 和传单绘制的圆半径不正确?

r - 如何从数据框中为 case_when 构造参数?

r - R中矩阵列表的元素中位数