【问题标题】:Function to find symmetric difference (opposite of intersection) in R?在R中找到对称差异(交叉点的对面)的函数?
【发布时间】:2013-11-16 20:32:53
【问题描述】:

问题

我有两个不同长度的字符串向量。每个向量都有一组不同的字符串。我想找到在一个向量中但不在两个向量中的字符串;也就是symmetric difference

分析

我查看了函数setdiff,但它的输出取决于考虑向量的顺序。我找到了自定义函数outersect,但是这个函数要求两个向量的长度相同。

有什么建议吗?

更正

这个问题似乎特定于我正在处理的数据。否则,下面的答案解决了我在这篇文章中提到的问题。我会看看我的数据有什么独特之处,如果我知道任何可能对其他用户有帮助的东西,我会发回。

【问题讨论】:

  • 除了已有的答案:还有sets::set_symdiff()

标签: r xor intersect set-difference symmetric-difference


【解决方案1】:

为什么不:

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

【讨论】:

  • 感谢您的建议,但是这个功能不起作用;输出不正确。我认为它被向量长度不同的事实绊倒了。
  • 您能否在您的问题中发布一些示例代码,显示一些示例输入以及您期望的输出?
  • @user2932774,这似乎正确回答了您发布的问题,它不依赖于相同长度的向量,尽管没有样本数据和预期输出,您可能误解了您的意图。
  • 我明白你在说什么,当我使用示例数据时,sym_diff 有效。出于某种原因,它不适用于我最初想应用此解决方案的数据。再次感谢您的建议。
  • @user2932774 在r 标签中,社区赞赏一个经过充分研究的问题,以及一个有数据的reproducible example。否则,这似乎是一个结构良好的问题。
【解决方案2】:

另一个更快的选项是:

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

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

【讨论】:

  • 这不需要unique 是吗? setdiff(a,b) 的输出不应该与setdiff(b,a) 的输出不同吗?
【解决方案3】:

这是另一个对称差分函数,这个来自定义(例如,可以在问题中链接到的维基百科页面中看到)。

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)

【讨论】:

    猜你喜欢
    • 2023-03-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-04-05
    • 2014-08-10
    • 1970-01-01
    • 1970-01-01
    • 2023-04-07
    相关资源
    最近更新 更多