执行两个无序字符向量之间的非成对全局比较---与交集相反---全局差集

5

示例数据

v1 <- c("E82391", "X2329323", "C239923", "E1211", "N23932", "F93249232", "X93201", "X9023111", "O92311", "9000F", "K9232932", "L9232932", "X02311111")
v2 <- c("L9232932", "C239923", "E1211", "E82391", "F93249232", "U82832")

问题

我想提取那些在一个向量中而不在另一个向量中的项。

我知道 setdiff 无法比较两个无序的字符向量并找出它们之间的所有差异。

例如,%in% 在两个字符向量之间执行全对全比较吗?

在这种情况下,它确实有效(尽管它没有报告那些在 v2 中而不在 v1 中的元素)。

> v1[!v1 %in% v2]
[1] "X2329323"  "N23932"    "X93201"    "X9023111"  "O92311"    "9000F"     "K9232932"  "X02311111"

另一种方法是使用名为outersect的用户自定义函数,如此处所示,该函数显示所有不同之处。

outersect <- function(x, y) {
  sort(c(x[!x%in%y],
         y[!y%in%x]))
}

outersect(v1,v2)

问题

我非常想知道是否有任何R函数可以轻松地执行两个字符向量之间的全对全比较!这个想法是为了真正提高代码的可读性(特别是当需要相互比较数十个向量时)。

执行这种全对全比较的最安全和最有效的方法是什么?更具体地说,R中是否有一个函数可以执行此操作?

参考资料。

  1. Breyal, Tony. "outersect(): R的intersect()函数的相反函数",2011年11月。R-bloggers。

2
我会说 c(v1[!v1 %in% v2], v2[!v2 %in% v1] ) - Flo.P
2个回答

0

这个怎么样?

setdiff(union(v1,v2),intersect(v1,v2))

[1] "X2329323"  "N23932"    "X93201"    "X9023111"  "O92311"    "9000F"
    "K9232932"  "X02311111" "U82832" 

0

也许是这样:

both <- c(unique(v1),unique(v2))
both[! (duplicated(both) | duplicated(both, fromLast = T))]
[1] "X2329323"  "N23932"    "X93201"    "X9023111"  "O92311"    "9000F"     "K9232932"  "X02311111" "U82832"   

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接