如何对两个无序字符向量执行双向全差异比较(取对称差集)
用
%in%实现双向向量差异提取 当然可以用%in%来完成这种双向的全差异比较!核心思路就是分别找出仅存在于v1但不在v2的元素,以及仅存在于v2但不在v1的元素,再把这两部分合并起来就行,具体操作如下:
步骤1:提取单向量独有的元素
要筛选v1中独有的元素,我们可以利用
%in%生成逻辑判断,再取反筛选:v1_only <- v1[!v1 %in% v2]这里
v1 %in% v2会返回一个与v1长度相同的逻辑向量,每个位置标记对应元素是否在v2中;加!就是取反,只保留不在v2里的v1元素。同理,提取v2中独有的元素:
v2_only <- v2[!v2 %in% v1]
步骤2:合并双向差异元素
把上面两个结果合并,就得到了所有仅存在于其中一个向量的元素:
bidirectional_diff <- c(v1_only, v2_only)
如果需要结果去重(通用场景下可能需要)或者排序,可以加上unique()和sort():
sorted_unique_diff <- sort(unique(bidirectional_diff))
完整代码示例
把你的向量代入后,完整代码如下:
v1 <- c("E82391", "X2329323", "C239923", "E1211", "N23932", "F93249232", "X93201", "X9023111", "O92311", "9000F", "K9232932", "L9232932", "X02311111") v2 <- c("L9232932", "C239923", "E1211", "E82391", "F93249232", "U82832") # 提取双向差异 v1_only <- v1[!v1 %in% v2] v2_only <- v2[!v2 %in% v1] bidirectional_diff <- c(v1_only, v2_only) # 输出结果 print(bidirectional_diff)
运行后会得到结果:
[1] "X2329323" "N23932" "X93201" "X9023111" "O92311" "9000F" "K9232932" "X02311111" "U82832"
小技巧:用setxor()直接实现
其实R里还有一个更简洁的内置函数setxor(),它直接就能返回两个集合的对称差(也就是双向差异),用法很简单:
setxor(v1, v2)
这个函数的结果和我们用%in%手动实现的完全一致,适合快速解决问题。
内容的提问来源于stack exchange,提问作者paropunam
相关产品推荐
相关产品推荐

