R 是否有办法找到与其他Lat/Long点半径范围内的Lat/Long点相关的值?

R 是否有办法找到与其他Lat/Long点半径范围内的Lat/Long点相关的值?,r,latitude-longitude,R,Latitude Longitude,我在数据表中有1000多行美国不同社区的lat/long数据。这些社区中有些是竞争对手,有些是我们自己的。每个社区都有若干单元(公寓)。在许多情况下,多个社区之间的距离在3英里以内。我正在寻找一种方法来完成以下工作:1)确定每个站点是否位于所有其他站点的3英里半径范围内,然后2)将位于该3英里半径范围内的站点的“单位”列相加。我想在数据表中添加两列。。。第一栏称为“场地数量”,第二栏称为“单元数量” 我已经编写了代码来检查是否有其他纬度/经度落在彼此3英里半径内,但这是我所能做到的 主_df有4

我在数据表中有1000多行美国不同社区的lat/long数据。这些社区中有些是竞争对手,有些是我们自己的。每个社区都有若干单元(公寓)。在许多情况下,多个社区之间的距离在3英里以内。我正在寻找一种方法来完成以下工作:1)确定每个站点是否位于所有其他站点的3英里半径范围内,然后2)将位于该3英里半径范围内的站点的“单位”列相加。我想在数据表中添加两列。。。第一栏称为“场地数量”,第二栏称为“单元数量”

我已经编写了代码来检查是否有其他纬度/经度落在彼此3英里半径内,但这是我所能做到的

主_df有400多根立柱。为了简化这一点,我重新编辑以仅显示所需的列

colnames(主函数) 结果:Lat、Lon、单位

因此,在这个问题中使用的代码是


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)