我在数据表中有超过1000行的纬度/经度数据,用于美国不同社区。这些社区中有一些是竞争对手,而其他则是我们自己的。每个社区都有许多单元(公寓)。在许多情况下,多个社区之间的距离都在3英里之内。我正在寻找一种方法来执行以下操作:1)确定每个站点是否位于所有其他站点的3英里半径之内,然后2)对位于该3英里半径之内的站点的“单位”列求和。我想将两列添加到数据表中……第一列称为“网站数量”,第二列为“单位数量”
我已经编写了代码来检查是否有其他经纬度落在彼此之间3英里的半径之内,但这已达到我的理解范围。
main_df有超过400列。为简化此操作,我重做以仅显示必需的列。
名字(main_df) 结果:纬度,经度,单位
因此该问题中使用的代码将是
main_df<-cbind(main_df, X=((X=rowSums(distm (main_df[,2:1],
fun = distHaversine) / 1000<= 4.828032)/3)-1))
如前所述,我希望结果将两个额外的列添加到main_df中。 列名(main_df) 结果:纬度,经度,单位,站点数,单位数
有点像这样...
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
答案 0 :(得分:0)
根据我之前的评论:
“我的建议是将distm函数的输出另存为变量。
然后,您可以搜索rowSums> 1的行,然后使用which函数查找附近单位的列(因此是原始数据框的行)。“
#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)