Расчет максимального расстояния между точками местоположения в двух разных сгруппированных фреймах данных - PullRequest
2 голосов
/ 03 августа 2020

У меня есть набор точек местоположения от разных людей:

locations <- data.frame(
  id=c('A', 'A', 'A', 'B', 'B', 'B', 'C', 'C', 'C'),
  xcoord=c(1, 8, 5, 22, 26, 24, 37, 35, 39),
  ycoord=c(3, 2, 9, 25, 23, 28, 31, 35, 33)
)

У каждого человека также есть одно центральное местоположение.

center <- data.frame(
  id=c('A', 'B', 'C'),
  xcoord=c(5, 24, 36),
  ycoord=c(4, 23, 34)
)

Мне нужно знать расстояние до самая дальняя точка расположения от центральной точки для каждого человека. Я пробовал работать с distm() и st_distance(), но у меня возникли проблемы с аспектом группирования. Например,

distm(cbind(locations$xcoord, locations$ycoord), cbind(center$xcoord, center$ycoord))

отлично вычисляет расстояния, но не делает различий между людьми (и это тоже довольно неуклюже). У меня дюжина человек с сотнями баллов каждый, поэтому очень важно отслеживать идентификаторы. Мне легко конвертировать между объектами data.frame и sf, поэтому подойдет любой подход. Я бы хотел решение по трубопроводу, но я возьму все, что смогу. Спасибо!

1 Ответ

2 голосов
/ 04 августа 2020

Вот что Билл упомянул в комментариях:

library(dplyr)
# modify names for the center dataframe
names(center)[2:3] <- paste0("center", names(center)[2:3])

# left join
locations.center <- left_join(locations, center)

# calculate the distance for each one
locations.center <- mutate(locations.center, dist=sqrt((xcoord-centerxcoord)^2 + (ycoord-centerycoord)^2))

    
# now if you only care about the max distance for each id:  
# (note this step can be combined with the previous step)         
locations.center <- group_by(locations.center, id)  %>% arrange(desc(dist)) %>% slice(1)  

    
...