Я не уверен, что вы хотите сделать с конечным условием, но с dplyr
вы можете делать все это без использования цикла for.
library(dplyr)
testdata %>% mutate(heading_diff = c(diff(heading),0),
speed_diff = c(diff(speed),0),
longdiff = c(diff(long),0),
latdiff = c(diff(lat),0))
%>% rowwise()
%>% mutate(spdist = spDists(cbind(c(long,long + longdiff),c(lat,lat +latdiff)),longlat = T, segments = T)*1000 )
%>% select(heading_diff,speed_diff,distance = spdist)
# heading_diff speed_diff distance
# <dbl> <dbl> <dbl>
# 1 15.9 0.107 326496
# 2 -345 -4.64 55184
# 3 124 -1.16 25256
# 4 85.6 5.24 221885
# 5 53.1 -2.23 17599
# 6 -184 2.33 225746
Я объясню каждую часть ниже:
Оператор канала %>%
- это, по сути, цепочка, которая отправляет результаты одной операции в следующую. Итак, мы начнем с ваших тестовых данных и отправим их в функцию mutate.
Используйте mutate
, чтобы создать 4 новых столбца, которые являются измерениями разности от одного ряда к другому. Добавление в 0 в последнем ряду, потому что нет измерения после последнего пункта данных. (Может сделать что-то вроде NA)
Затем, когда у вас есть различия, которые вы хотите использовать rowwise
, вы можете применить функцию spDists
к каждой строке.
Наконец, мы создаем еще один столбец с mutate
, который вызывает исходные 4 столбца, которые мы создали ранее.
Чтобы получить только те 3 столбца, которые вас интересуют, в конце я использовал оператор select
. Вы можете не указывать это, если хотите весь массив данных.