如何保留名称提取R语言命名列表中的唯一元素?
高效保留名称的列表去重方案
给定命名列表:
l <- list(x = c(1, 2), x = c(1, 2), x = c(1, 3), y = c(1,3))
要实现保留元素名称、仅删除“名称和元素值完全重复”的项,同时避开unique()丢失名称、l[!duplicated(l)]误删同值不同名元素、tibble+dplyr组合效率低的问题,这里提供两个高效的base R方案:
方案1:基于名称+元素值的组合键去重
通过生成每个元素的唯一标识键,筛选非重复项:
# 生成名称+元素值拼接的唯一键 keys <- mapply(function(nm, val) paste(nm, paste(val, collapse = ","), sep = "|"), names(l), l) # 提取非重复元素 result <- l[!duplicated(keys)]
输出结果完全符合预期:
list(x = c(1, 2), x = c(1, 3), y = c(1, 3))
方案2:无字符串拼接的高效判断(推荐)
如果列表元素都是数值向量,直接通过元素值和名称的重复状态组合判断,避免字符串操作,效率更高:
# 分别标记元素值重复、名称重复的位置 val_dup <- duplicated(l) name_dup <- duplicated(names(l)) # 保留“元素值不重复”或“元素值重复但名称不同”的项 result <- l[!val_dup | !name_dup]
这个方法逻辑简洁,运算速度更快,同样能得到目标结果。
内容的提问来源于stack exchange,提问作者olivroy
相关产品推荐
相关产品推荐

