Я хочу вычислить минимальное расстояние между текущей строкой и каждой строкой перед ней в каждой группе.Мой фрейм данных имеет несколько групп, и каждая группа имеет несколько дат с долготой и широтой.Я использую функцию Haversine для вычисления расстояния, и мне нужно применить эту функцию, как описано выше.Фрейм данных выглядит следующим образом:
grp date long lat rowid
1 1 1995-07-01 11 12 1
2 1 1995-07-05 3 0 2
3 1 1995-07-09 13 4 3
4 1 1995-07-13 4 25 4
5 2 1995-03-07 12 6 1
6 2 1995-03-10 3 27 2
7 2 1995-03-13 34 8 3
8 2 1995-03-16 25 9 4
Моя текущая попытка использует purrrlyr :: by_row, но метод слишком медленный.На практике каждая группа имеет тысячи дат и географических положений.Вот часть моей нынешней попытки:
calc_min_distance <- function(df, grp.name, row){
df %>%
filter(
group_name==grp.name
) %>%
filter(
row_number() <= row
) %>%
mutate(
last.lat = last(lat),
last.long = last(long),
rowid = 1:n()
) %>%
group_by(rowid) %>%
purrrlyr::by_row(
~haversinedistance.fnct(.$last.long, .$last.lat, .$long, .$lat),
.collate='rows',
.to = 'min.distance'
) %>%
filter(
row_number() < n()
) %>%
summarise(
min = min(min.distance)
) %>%
.$min
}
df_dist <-
df %>%
group_by(grp_name) %>%
mutate(rowid = 1:n()) %>%
group_by(grp_name, rowid) %>%
purrrlyr::by_row(
~calc_min_distance(df, .$grp_name,.$rowid),
.collate='rows',
.to = 'min.distance'
) %>%
ungroup %>%
select(-rowid)
Предположим, что расстояние определяется как (лат + длинный) для справки ряд - (лат + длинный) для каждого парного ряда меньше, чем опорный ряд.Мой ожидаемый результат для grp 1 следующий:
grp date long lat rowid min.distance
1 1 1995-07-01 11 12 1 0
2 1 1995-07-05 3 0 2 -20
3 1 1995-07-09 13 4 3 -6
4 1 1995-07-13 4 25 4 6
Как быстро вычислить минимальное расстояние между текущим rowid и всеми rowid до него?