You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

基于组合集合去除数据框中的重复条目

解决方法:移除等价地点对的重复行

我来帮你搞定这个问题!之前那些通用的组合去重方案之所以不管用,是因为咱们的场景里每个地点是经纬度的组合体,不能单独看某一列,得把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.445948.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

火山引擎 最新活动