Есть ли способ найти значения, связанные с точками широты и долготы, которые находятся в пределах радиуса других точек широты и долготы? - PullRequest
1 голос
/ 30 мая 2019

У меня есть более 1000 строк данных по широте / длине для разных сообществ в США в таблице данных.Некоторые из этих сообществ являются конкурентами, а другие наши.Каждое из этих сообществ имеет несколько единиц (квартир).Есть много случаев, когда несколько сообществ находятся в пределах 3 миль друг от друга.Я ищу способ сделать следующее: 1) определить, находится ли каждый из сайтов в радиусе 3 миль от ВСЕХ других сайтов, ТО 2) суммировать столбец «единицы» сайтов, которые попадают в этот радиус в 3 мили.Я хотел бы, чтобы два столбца были добавлены в таблицу данных ... первый столбец называется "количество сайтов", а второй - "количество единиц"

У меня уже был написан код для проверки, чтобы увидеть, есть ли другие широты и долготы.упал в радиусе 3 миль друг от друга, но это насколько я понял.

main_df имеет более 400 столбцов.Чтобы упростить это, я перерисовал, чтобы показать только необходимые столбцы ..

colnames (main_df) Результат: Lat, Lon, Units

Таким образом, код для использования в этом вопросе будет

main_df<-cbind(main_df, X=((X=rowSums(distm (main_df[,2:1], 
     fun = distHaversine) / 1000<= 4.828032)/3)-1))

Как упоминалось ранее, я ожидаю, что в результате мы добавим два дополнительных столбца в main_df.colnames (main_df) Результат: Lat, Lon, Units, количество сайтов, количество единиц

Так вроде как ...

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

1 Ответ

0 голосов
/ 30 мая 2019

Согласно моему предыдущему комментарию:
"Мое предложение - сохранить вывод функции 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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...