如何在R语言中移除列表里‘集合等价’的重复元素?
解决R语言中移除集合等价重复元素的问题
我懂你的困扰:unique(li)只会认完全一模一样的向量(连元素顺序都得丝毫不差),但对那些元素相同、只是顺序不同的「集合等价」重复项完全没辙。这里有个简单高效的解决方案,核心思路是把每个向量转换成集合的统一标准形式,再做去重。
方法原理
集合的核心是元素的无序组合,那我们先给每个向量做排序——这样集合等价的向量就会变成完全一致的向量,之后用duplicated()就能轻松识别出重复项了。
代码示例
先构造一个和你描述匹配的示例列表:
# 示例列表:a与d、c与g属于集合等价 li <- list( a = c(1, 2, 3), b = c(4, 5), c = c(6, 7, 8), d = c(3, 1, 2), # 和a集合等价 e = c(9), g = c(8, 6, 7) # 和c集合等价 )
接下来执行去重操作:
# 1. 给每个列表元素排序,生成标准化的向量列表 sorted_li <- lapply(li, sort) # 2. 标记重复的标准化向量,筛选原列表的非重复项 li_unique_set <- li[!duplicated(sorted_li)]
运行后查看结果:
li_unique_set #> $a #> [1] 1 2 3 #> #> $b #> [1] 4 5 #> #> $c #> [1] 6 7 8 #> #> $e #> [1] 9
可以看到,集合等价的d和g已经被移除,每个等价组只保留了第一个出现的元素。
扩展优化
- 要是你想保留每个等价组的最后一个元素,只需给
duplicated()加个参数:li_unique_set_last <- li[!duplicated(sorted_li, fromLast = TRUE)] - 哪怕你的向量是字符型元素,这个方法也完全适用——排序操作对字符向量同样有效。
内容的提问来源于stack exchange,提问作者Piotr Wilczek
相关产品推荐
相关产品推荐

