首页 > 解决方案 > 在两个无序字符向量之间执行非成对的全对全比较 --- intersect 的反面 --- all-to-all setdiff

问题描述

示例数据

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. 布雷亚尔,托尼。“ outersect():与 R 的 intersect() 函数相反”,2011 年 11 月。R-bloggers。

标签: rvectorintersectset-difference

解决方案


这个怎么样...

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

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

推荐阅读