r - 通过共同的经纬度对匹配两个数据帧,并从中创建一个新列
问题描述
我有两个带有坐标的数据框:
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 位。
解决方案
该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 对可以与另一个数据框中的一对以上匹配,那么您当前的问题没有得到很好的定义,您需要提供其他逻辑来处理这个问题。
推荐阅读
- javascript - 在线或外部的 CSS 更好
- java - Java在数字末尾添加“0”
- python - 什么是 pandas dataframe.ne 方法以及为什么使用它?
- python - Python 中内部 hash() 函数的复杂性
- r - 使用自动绘图在多变量生存分析中绘制单图
- gcc - STM32 系列中链接脚本部分的 ALIGN(n) 差异
- python - 如何在 csv 文件上运行 FOR LOOP
- laravel - laravel删除方法不起作用
- java - 尽管我的代码返回字符串,但该函数仍希望返回字符串
- angular - 具有多个输入的 FormControlName 的 ControlValueAccessor