数据集中有两个变量:x和y
我想以一种既可以为真,又不能为假的方式对数据帧进行子集
我试过:
x == 1 | y == 1 & x != 0 & y !=0
我能理解这样表述逻辑时有问题,但我不明白为什么,确切地说是
我应该怎么做?
x & y
-两者都必须为truex | y
-至少1为真(或两者都为真(xor(x, y)
——恰好一个是真的(而不是两者都是(!x & !y
-两者都不是真的。(与!(x | y)
相同。(
这应该涵盖得很好。
如果数据是二进制的(1和0(,1将被视为TRUE
,0将被视为FALSE
,所以您不需要为一堆==
而烦恼。
如果你组合了多个逻辑运算符,我强烈建议使用括号来确保操作/分组的顺序是你认为的
m = expand.grid(x = c(0:1,NA), y = c(0:1,NA) )
## Truth Table
# x y x & y x | y xor(x, y) !x & !y
# 1 0 0 FALSE FALSE FALSE TRUE
# 2 1 0 FALSE TRUE TRUE FALSE
# 3 NA 0 FALSE NA NA NA
# 4 0 1 FALSE TRUE TRUE FALSE
# 5 1 1 TRUE TRUE FALSE FALSE
# 6 NA 1 NA TRUE NA FALSE
# 7 0 NA FALSE NA NA NA
# 8 1 NA NA TRUE NA FALSE
# 9 NA NA NA NA NA NA
因为R从左到右解释优先级相等的中缀表达式,我认为一旦对前两个表达式进行了求值,您就会发现其余的表达式完全多余。逻辑OR(|(将允许两者都为真。这不是XOR(所谓的"异或"(。你应该意识到,如果x和y都是NA,你就会得到NA。所以你可能想先测试一下,然后决定在这种情况下你想发生什么。