R data.table如何删除列值互为镜像的重复行
R data.table 筛选删除镜像重复行方案
核心思路
对每行的对称列生成标准化的唯一标识,让互为镜像的行生成的标识完全相同,再基于标识去重即可。
实现代码
library(data.table) # 示例数据 dt = data.table(A=c(1, 5, 9, 3, 7, 11), B=c(2, 6, 10, 4, 8, 12), C=c(3, 7, 11, 1, 5, 9), D=c(4, 8, 12, 2, 6, 10), E=c(47, 21, 45, 27, 40, 33), F=c(27, 40, 33, 47, 21, 45)) # 生成标准化键,镜像行的键值完全一致 dt[, unique_key := paste( pmin(A,C), pmin(B,D), pmax(A,C), pmax(B,D), pmin(E,F), pmax(E,F), sep = "_" )] # 保留每组镜像行的第一行 dt_unique <- dt[!duplicated(unique_key), !"unique_key"] # 如果要保留每组镜像行的最后一行,替换为以下代码 # dt_unique <- dt[!duplicated(unique_key, fromLast = TRUE), !"unique_key"]
输出结果
print(dt_unique) # A B C D E F # 1: 1 2 3 4 47 27 # 2: 5 6 7 8 21 40 # 3: 9 10 11 12 45 33
说明
该方案使用全向量化操作,无逐行循环,性能很高,适合处理百万级以上的大表。如果对称列规则有调整,只需要修改unique_key的生成逻辑即可,比如增加更多对称列的pmin/pmax配对。
内容的提问来源于stack exchange,提问作者EB2127
相关产品推荐
相关产品推荐

