基于组合集合去除数据框中的重复条目
解决方法:移除等价地点对的重复行
我来帮你搞定这个问题!之前那些通用的组合去重方案之所以不管用,是因为咱们的场景里每个地点是经纬度的组合体,不能单独看某一列,得把A的经纬度当成一个整体、B的经纬度当成另一个整体来判断等价性。
核心思路很简单:给每一行的(A,B)地点对生成一个有序的唯一标识,这样(A,B)和(B,A)会生成完全一样的标识,之后基于这个标识去重就行。
具体实现代码
先把你的数据框放出来,然后一步步处理:
# 你的原始数据框 C <- data.frame(A_Latitude = c(48.4459, 48.7 , 49.0275, 49.0275, 49.0275, 49.0275, 48.4459), A_Longitude = c(9.989 , 8.15 , 8.7539 , 8.7539 , 8.7539 , 8.7539 , 9.989 ), B_Latitude = c(49.0275, 48.4734, 48.4459, 48.9602, 48.9602, 48.4459, 49.0275), B_Longitude = c(8.7539 , 9.227 , 9.989 , 9.2058 , 9.2058 , 9.989 , 8.7539 )) # 第一步:把每个地点的经纬度合并成唯一字符串(用下划线分隔,避免数字混淆) C$A_location <- paste(C$A_Latitude, C$A_Longitude, sep = "_") C$B_location <- paste(C$B_Latitude, C$B_Longitude, sep = "_") # 第二步:对每行的A和B地点字符串排序,生成统一的键(这样A-B和B-A会得到相同的键) C$pair_key <- apply(C[, c("A_location", "B_location")], 1, function(x) paste(sort(x), collapse = "_")) # 第三步:基于pair_key去重,只保留第一次出现的行 C_unique <- C[!duplicated(C$pair_key), ] # 可选:删掉临时生成的辅助列,回到原始列结构 C_unique <- C_unique[, !names(C_unique) %in% c("A_location", "B_location", "pair_key")] # 看看结果! print(C_unique)
代码解释
- 生成地点字符串:用
paste把纬度和经度拼在一起,加下划线是为了避免像48.44599.989这种分不清的情况,确保每个地点的坐标组合是唯一标识。 - 生成排序键:用
apply对每行的A、B地点字符串排序后再拼接,比如A是48.4459_9.989、B是49.0275_8.7539,排序后拼接的键和B、A互换后的键完全一样,这样等价的行就会被标记为重复。 - 去重:
duplicated函数会标记重复的pair_key,我们取反后就能保留唯一的行。
额外提示:处理浮点精度问题
如果你的经纬度是浮点型数据,可能存在肉眼看不到的微小精度差异(比如48.4459和48.445900001),这会导致等价行无法被识别。这时候可以先对坐标做四舍五入:
# 四舍五入到4位小数,根据你的需求调整精度 C$A_Latitude <- round(C$A_Latitude, 4) C$A_Longitude <- round(C$A_Longitude, 4) C$B_Latitude <- round(C$B_Latitude, 4) C$B_Longitude <- round(C$B_Longitude, 4)
运行完代码后,你会发现原始数据里第1行和第7行、第3行和第6行这些等价对都只保留了一行,完美解决问题!
内容的提问来源于stack exchange,提问作者Dan




