在 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)