R 是否有办法找到与其他Lat/Long点半径范围内的Lat/Long点相关的值?
我在数据表中有1000多行美国不同社区的lat/long数据。这些社区中有些是竞争对手,有些是我们自己的。每个社区都有若干单元(公寓)。在许多情况下,多个社区之间的距离在3英里以内。我正在寻找一种方法来完成以下工作:1)确定每个站点是否位于所有其他站点的3英里半径范围内,然后2)将位于该3英里半径范围内的站点的“单位”列相加。我想在数据表中添加两列。。。第一栏称为“场地数量”,第二栏称为“单元数量” 我已经编写了代码来检查是否有其他纬度/经度落在彼此3英里半径内,但这是我所能做到的 主_df有400多根立柱。为了简化这一点,我重新编辑以仅显示所需的列 colnames(主函数) 结果:Lat、Lon、单位 因此,在这个问题中使用的代码是R 是否有办法找到与其他Lat/Long点半径范围内的Lat/Long点相关的值?,r,latitude-longitude,R,Latitude Longitude,我在数据表中有1000多行美国不同社区的lat/long数据。这些社区中有些是竞争对手,有些是我们自己的。每个社区都有若干单元(公寓)。在许多情况下,多个社区之间的距离在3英里以内。我正在寻找一种方法来完成以下工作:1)确定每个站点是否位于所有其他站点的3英里半径范围内,然后2)将位于该3英里半径范围内的站点的“单位”列相加。我想在数据表中添加两列。。。第一栏称为“场地数量”,第二栏称为“单元数量” 我已经编写了代码来检查是否有其他纬度/经度落在彼此3英里半径内,但这是我所能做到的 主_df有4
main_df根据我之前的评论:
“我的建议是将distm函数的输出保存为变量。
然后,您可以搜索行和>1的行,然后使用which函数查找附近单位的列(因此是原始数据帧的行)。”
#为测试添加的最后一行
根据我之前的评论:
“我的建议是将distm函数的输出保存为变量。
然后,您可以搜索行和>1的行,然后使用which函数查找附近单位的列(因此是原始数据帧的行)。”
#为测试添加的最后一行
这本书也许能帮你解决这个问题。我书签的“距离关系”部分希望能有所帮助。你在这方面做得很好。我的建议是将distm
函数的输出保存为变量。然后,您可以搜索行和大于1的行,然后使用which
函数查找附近单位的列(因此是原始数据框的行)。@Dave2e,我试着按照您说的做了,但似乎无法正常工作。。。我对R有些陌生。你能告诉我你的意思吗?我可以得到#of sites列,但不知道如何得到#of Units列。这本书也许能帮你解决这个问题。我书签的“距离关系”部分希望能有所帮助。你在这方面做得很好。我的建议是将distm
函数的输出保存为变量。然后,您可以搜索行和大于1的行,然后使用which
函数查找附近单位的列(因此是原始数据框的行)。@Dave2e,我试着按照您说的做了,但似乎无法正常工作。。。我对R有些陌生。你能告诉我你的意思吗?我能够获得“站点”列,但不知道如何获得“单位”列感谢演练。。。我不确定你的代码和我的代码之间的区别,但出于某种原因,下面的代码为我提供了一个更准确的网站编号distmatI在为sumunits
列捕获正确的数字时遇到问题。。因为它是所有东西的总和,包括它自己的单位。例如:lat 40.06127和lon-86.05604,共有80个单位(上面显示的第一行i)sumunits
应仅包括其他lat/lon的125和59个单位。不是自己的单位,然后是125和59。所以正确的总数应该是184,而不是264。这有意义吗?我稍微编辑了代码,在初始数据帧中只包含lat/long和units。对于这个测试用例,它的工作方式与我预期的一样。我不知道你所说的更准确的网站数量是什么意思?我的距离矩阵首先计算距离,然后它只跟踪>0的距离,感谢您的演练。。。我不确定你的代码和我的代码之间的区别,但出于某种原因,下面的代码为我提供了一个更准确的网站编号distmatI在为sumunits
列捕获正确的数字时遇到问题。。因为它是所有东西的总和,包括它自己的单位。例如:lat 40.06127和lon-86.05604,共有80个单位(上面显示的第一行i)sumunits
应仅包括其他lat/lon的125和59个单位。不是自己的单位,然后是125和59。所以正确的总数应该是184,而不是264。这有意义吗?我稍微编辑了代码,在初始数据帧中只包含lat/long和units。对于这个测试用例,它的工作方式与我预期的一样。我不知道你所说的更准确的网站数量是什么意思?我的距离矩阵首先计算距离,然后只跟踪>0和>0的距离
Lat Lon Units #of Sites #of Units
40.06127 -86.05604 80 2 184
41.15241 -85.12709 123 3 262
42.91640 -83.62937 125 1 200
39.67114 -86.07211 59 0 0
41.24905 -81.83060 200 4 387
#Last rows added for testing
main_df<-read.table(header=TRUE, text="Lat Lon Units
40.06127 -86.05604 80
41.15241 -85.12709 123
42.91640 -83.62937 125
39.67114 -86.07211 59
41.24905 -81.83060 200
40.061 -86.056 100
40.060 -86.0561 300")
library(geosphere)
#create and store distance matrix
#this will be a square matrix the length and width of as the number of rows in main_df.
# be aware of memory use.
distmat<-distm (main_df[,2:1], fun = distHaversine)/1000
# convert to logical matrix of units nearby, exclude same location.
distmat<-(distmat >0 & distmat <= 4.828032)
main_df$nearbysites <- rowSums(distmat)
#find rows where there is at least one other nearby sites
rowsnearby<-which(main_df$nearby >0)
#add place holding columns
main_df$sumunits<-0
#loop through all of the rows with more than 1 nearby site
for (i in rowsnearby){
#find columns which are nearby, the column number is the same as the rows of main df that are close by
targetrows<-which(distmat[i,]==TRUE)
#find sum
main_df$sumunits[i]<-sum(main_df$Units[targetrows])
}
print(main_df)