在R中找到对称差异(交叉点的对面)的函数?

Gya*_*eda 5 r xor set-difference intersect symmetric-difference

问题

我有两个不同长度的字符串向量.每个向量都有一组不同的字符串.我想找到一个向量但不在两个向量中的字符串; 也就是说,对称差异.

分析

我查看了函数setdiff,但其输出取决于向量的考虑顺序.我发现自定义函数outersect,但是这个函数要求两个向量具有相同的长度.

有什么建议?

更正

这个问题似乎与我工作的数据有关.否则,下面的答案解决了我在这篇文章中提到的问题.我会看看我的数据有什么独特之处,如果我学到任何可能对其他用户有帮助的东西,我会回复.

Blu*_*ter 13

为什么不:

sym_diff <- function(a,b) setdiff(union(a,b), intersect(a,b))
Run Code Online (Sandbox Code Playgroud)

  • 您可以在问题中发布一些示例代码,显示一些示例输入以及您希望输出的内容吗? (3认同)
  • @ user2932774,这似乎正确回答了您发布的问题,并且它不依赖于矢量长度相同,尽管没有样本数据和预期输出您可能误传了您的意图. (3认同)
  • @user2932774 在“r”标签中,社区赞赏一个经过充分研究的问题,以及一个[可重现的示例](http://stackoverflow.com/questions/5963269/how-to-make-a-great-r-reproducible-示例)有数据的地方。否则,这似乎是一个结构良好的问题。 (2认同)

seb*_*rdo 6

另一个更快的选择是:

sym_diff2 <- function(a,b) unique(c(setdiff(a,b), setdiff(b,a)))
Run Code Online (Sandbox Code Playgroud)

如果我们将它与Blue Magister的答案进行比较:

sym_diff <- function(a,b) setdiff(union(a,b), intersect(a,b))

library(microbenchmark)
library(MASS)

set.seed(1)
cars1 <- sample(Cars93$Make, 70)
cars2 <- sample(Cars93$Make, 70)

microbenchmark(sym_diff(cars1, cars2), sym_diff2(cars1, cars2), times = 10000L)

>Unit: microseconds
>                  expr     min       lq     mean   median      uq      max neval
>sym_diff(cars1, cars2) 114.719 119.7785 150.7510 125.0410 131.177 12382.02 10000
>sym_diff2(cars1, cars2) 94.369 100.0205 121.6051 103.8285 109.239 12013.69 10000

identical(sym_diff(cars1, cars2), sym_diff2(cars1, cars2))
>[1] TRUE
Run Code Online (Sandbox Code Playgroud)

当比较的样本较大(数千或更多)时,这两种方法之间的速度差异会增加,但我找不到与这么多变量一起使用的示例数据集.