Оценить расстояние между одним ссылочным столбцом и несколькими столбцами в r с помощью цикла for? - PullRequest
0 голосов
/ 07 сентября 2018

У меня есть фрейм данных (df) со следующей структурой:

ID   Long_Ref   Lat_Ref    Long_1   Lat_1    Long_2   Lat_2
A    -71.69     -33.39    -70.29   -33.39   -71.69   -34.19
B    -72.39     -34.34    -74.29   -31.19   -70.54   -33.38
C    -70.14     -32.38    -70.62   -32.37   -69.76   -32.22
D    -70.39     -33.54    -70.42   -34.99   -68.69   -32.33

Я пытаюсь добавить новые столбцы в существующий фрейм данных с расстоянием между Ref и 1, Ref и 2 и т. Д., Используя distHaversine.

Это код, с которым я работал до сих пор:

for (i in 1:2){
for (j in 1:nrow(df)){
df[,paste("Dist_Mts_",i,sep="")][j]<-distHaversine(matrix(c(df$Long_Ref,df$Lat_Ref),ncol=2),
                      matrix(c(as.matrix(df[,paste("Long_",i,sep="")]),
                               as.matrix(df[,paste("Lat_",i,sep="")])),ncol=2))
 }
}

Тем не менее, я получаю следующую ошибку:

Error in .pointsToMatrix(p2) * toRad : 
  non-numeric argument to binary operator
In addition: Warning message:
In .pointsToMatrix(p2) : NAs introduced by coercion

Буду признателен за любую помощь. Спасибо.

1 Ответ

0 голосов
/ 07 сентября 2018

Предполагая, что у вас есть количество точек, которые могут быть больше 2, для которых вы хотите рассчитать расстояния, вы можете сделать что-то вроде этого (без использования петли for):

point.no <- 1:2 # depending on how many points you have

library(tidyverse)
point.no %>% 
  map(~ paste0(c('Long_', 'Lat_'), .x)) %>% 
  setNames(paste0('Dist_Mts_', point.no)) %>% 
  map_df(~ distHaversine(df[c('Long_Ref', 'Lat_Ref')], df[.x]))

Если вам нужно только вычислить расстояния до этих двух точек, вы можете просто написать это:

list(Dist_Mts_1=c('Long_1', 'Lat_1'), Dist_Mts_2=c('Long_2', 'Lat_2')) %>% 
  map_df(~ distHaversine(df[c('Long_Ref', 'Lat_Ref')], df[.x]))

Выход:

# A tibble: 4 x 2
  Dist_Mts_1 Dist_Mts_2
       <dbl>      <dbl>
1     130123      89056
2     393159     201653
3      45141      39946
4     161437     208248
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...