【问题标题】:R: Find duplicates that are within a certain valueR:查找特定值内的重复项
【发布时间】:2016-08-05 05:59:58
【问题描述】:

我有一个数据框 (df),其中包括纬度和经度坐标 (Lat, Long) 以及每个条目的温度测量的深度 (Depth)。本质上,每个条目都有 (x,y,z)=(Lat,Long,Depth) 位置信息用于每个温度测量。

我正在尝试通过查找和删除重复的测量位置来清理数据。最简单的部分是删除 exact 重复项,处理方式如下:

df = df[!(duplicated(df$Lat) & duplicated(df$Long) & duplicated(df$Depth)),]

但问题是某些条目的 lat/long 值只是 略微 关闭,这意味着上面的代码不会捕获它们,但它们仍然明显重复(例如 lat = 39.252880 &纬度 = 39.252887)。

有没有办法找到在第一个实例的某个绝对值或百分比范围内的重复项?

感谢您的帮助,谢谢!

【问题讨论】:

  • 您可以将所有值四舍五入到您喜欢的任何容差,然后查找重复项。在您的示例中,四舍五入到小数点后三位将给出两个点的纬度 = 39.253。或者,计算每个测量值之间的空间距离并找到在彼此的某个临界距离内聚集的点组可能更有意义。然后,在这些集群中,找到具有相同深度的行并对它们进行平均。请参阅this SO answer,了解如何查找空间距离和识别点簇。
  • 第一种方法,你可以缩短你的代码:df.new = df[!duplicated(round(df[,c("lat","long","depth")], 3)), ].

标签: r duplicates


【解决方案1】:

基于这个post,我想出了一个解决方案。我修改了函数,使“重复”的容差更严格为 0.001,否则函数不变。但是,该应用程序会稍微更改为:

output=data.frame(apply(dataDF,2,fun))

因为我想比较单列而不是单行中的值。

为了继续,我将人工索引添加到我的输出数据框以供以后使用:

output$ind = 1:nrow(output)

主要部分是查找函数为三个位置信息字段(纬度、经度、深度)返回 TRUE 的行索引。以下代码查找所有三个都为真的索引,创建一个仅包含这些条目(仍然是逻辑)的临时数据框,找到重复项的索引,然后将其反转以返回将从完整的原始数据集中删除的索引(请原谅错误的变量名):

ind = which(with(output,(Lat=='TRUE' & Long=='TRUE' & Depth=='TRUE')))
temp = dataDF[ind,]
temp$ind = ind
ind2 = duplicated(temp[,1:3])
rem = ind[ind2]

df.final = dataDF[-rem,]

希望对您有所帮助!这有点复杂,对于大型数据集,该函数非常很慢,但它可以完成工作。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-10-31
    • 1970-01-01
    • 2013-05-30
    • 1970-01-01
    • 2021-12-27
    • 2012-09-26
    • 1970-01-01
    • 2021-11-09
    相关资源
    最近更新 更多