在 R 中进行多重异或比较的优雅解决方案是什么?
What is an elegant solution to make multiple xor comparisons in R?
我需要根据多个互斥条件过滤数据集。 xor
运算符似乎对这种情况很有用,但在 dplyr::filter
函数中使用感觉有点尴尬。其他逻辑运算符(|
、&
、==
等)允许我链接比较,但我还没有找到使用 xor
执行此操作的方法。以下是我能想到的两种方法:
library(tidyverse)
#a)
Orange %>%
filter(xor(Tree == 1, xor(circumference == 75, age == 1582)))
#b)
Orange %>%
filter((Tree == 1 & !(circumference == 75) & !(age == 1582)) |
(Tree != 1 & circumference == 75 & !(age == 1582)) |
(Tree != 1 & !(circumference == 75) & age == 1582))
两者似乎都有点复杂。在我的数据集中,我需要测试五个条件,嵌套版本 a) 变得混乱。它也遵循与其他类型的比较截然不同的模式。方法 b) 臃肿并增加了拼写错误的风险。
我认为 %in%
运算符形式的东西可能有用,比如 %xor%
,但它似乎不存在:
library(tidyverse)
Orange %>%
filter(Tree == 1 %xor% circumference == 75 %xor% age == 1582)
有什么方法比 a) 或 b) 更优雅且实际有效?
使用布尔值到整数的显式转换来查看您正在执行的 3 项逻辑检查的矢量化总和为 1 的位置。
Orange %>%
filter((Tree == 1) + (circumference == 75) + (age == 1582) == 1)
我需要根据多个互斥条件过滤数据集。 xor
运算符似乎对这种情况很有用,但在 dplyr::filter
函数中使用感觉有点尴尬。其他逻辑运算符(|
、&
、==
等)允许我链接比较,但我还没有找到使用 xor
执行此操作的方法。以下是我能想到的两种方法:
library(tidyverse)
#a)
Orange %>%
filter(xor(Tree == 1, xor(circumference == 75, age == 1582)))
#b)
Orange %>%
filter((Tree == 1 & !(circumference == 75) & !(age == 1582)) |
(Tree != 1 & circumference == 75 & !(age == 1582)) |
(Tree != 1 & !(circumference == 75) & age == 1582))
两者似乎都有点复杂。在我的数据集中,我需要测试五个条件,嵌套版本 a) 变得混乱。它也遵循与其他类型的比较截然不同的模式。方法 b) 臃肿并增加了拼写错误的风险。
我认为 %in%
运算符形式的东西可能有用,比如 %xor%
,但它似乎不存在:
library(tidyverse)
Orange %>%
filter(Tree == 1 %xor% circumference == 75 %xor% age == 1582)
有什么方法比 a) 或 b) 更优雅且实际有效?
使用布尔值到整数的显式转换来查看您正在执行的 3 项逻辑检查的矢量化总和为 1 的位置。
Orange %>%
filter((Tree == 1) + (circumference == 75) + (age == 1582) == 1)