首页 > 解决方案 > 通过共同的经纬度对匹配两个数据帧,并从中创建一个新列

问题描述

我有两个带有坐标的数据框:

lat<-c(36.09163,36.16152,36.13027
,36.24514)
lon<-c(-95.84311,-95.83745
,-96.10115,-95.84191)
weight<-c(87,45,656,78)
df1<-data.frame(lat,lon,weight)



lat<-c(36.09163,36.16152,36.130279,36.24514)
lon<-c(-95.84311,-95.83745
       ,-96.101159,-95.841919)
df2<-data.frame(lat,lon)

我想要实现的是找到所有常见的 lat-long 对,当它们都具有至少 5 个常见的十进制数字(当然还有整数)以及另一个数据帧的 lat-long 对时。发生这种情况时,第二个数据帧应weight在名为 的新列中采用第一个数据帧的相对值weight。在玩具示例中,我给出的所有对都应该被认为是相同的。如果不是,那么新的权重值应该是 0。我需要类似的东西:

n<-merge(df1,df2,all.x=TRUE)

但我不知道如何处理数字问题,因为有些坐标有 5 位,而另一些有 6 位。

标签: r

解决方案


sqldf包在这里可能会有所帮助,因为您可以使用两个数据框之间的 SQL 连接巧妙地制定您的问题:

library(sqldf)

sql <- "SELECT df2.lat, df2.lon, COALESCE(df1.weight, 0) weight
        FROM df2
        LEFT JOIN df1
            ON ROUND(df1.lat - 0.5, 5) = ROUND(df2.lat - 0.5, 5) AND
               ROUND(df1.lon - 0.5, 5) = ROUND(df2.lon - 0.5, 5)"

df2 <- sqldf(sql)

请注意,您似乎想要截断每个 lat/lng 值,然后进行比较。也就是说,来自两个数据帧的以下两个纬度值应该被认为是等效的:

36.130279
36.13027

我们可以通过截断到 5 位数字然后比较来做到这一点。由于 SQLite 没有 floor 函数,我们可以通过减法0.5然后四舍五入到 5 位来模拟。

此外,如果给定的 lat/lng 对可以与另一个数据框中的一对以上匹配,那么您当前的问题没有得到很好的定义,您需要提供其他逻辑来处理这个问题。


推荐阅读