问题
我有两个不同长度的字符串向量。每个向量都有一组不同的字符串。我想找到一个向量但不在两个向量中的字符串;也就是symmetric difference。
分析
我查看了函数setdiff,但其输出取决于向量的考虑顺序。我找到了自定义函数outersect,但是这个函数要求两个向量具有相同的长度。
有什么建议吗?
校正
这个问题似乎与我工作的数据有关。否则,下面的答案解决了我在这篇文章中提到的问题。我会看看我的数据有什么独特之处,如果我学到任何可能对其他用户有帮助的东西,我会回发。
答案 0 :(得分:10)
为什么不:
sym_diff <- function(a,b) setdiff(union(a,b), intersect(a,b))
答案 1 :(得分:6)
另一个更快一点的选择是:
sym_diff2 <- function(a,b) unique(c(setdiff(a,b), setdiff(b,a)))
如果我们将它与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
当比较的样本较大(数千或更多)时,这两种方法之间的速度差异会增加,但我找不到与这么多变量一起使用的示例数据集。
答案 2 :(得分:0)
这是另一个对称差分函数,从定义中可以看出(例如,可以在问题所链接到的Wikipedia页面中看到)。
sym_diff3 <- function(a, b) union(setdiff(a, b), setdiff(b, a))
将由用户this other answer在sebpardo中运行的测试中的函数包括在内,将产生大致相同的时序,但速度稍慢。输出省略。
identical(sym_diff(cars1, cars2), sym_diff3(cars1, cars2))
#[1] TRUE
microbenchmark(sym_diff(cars1, cars2),
sym_diff2(cars1, cars2),
sym_diff3(cars1, cars2),
times = 10000L)