R: цикл по data.frame в парах строк - PullRequest
0 голосов
/ 02 мая 2018

Я бы хотел обработать несколько строк GPS-данных попарно.

Пока я делаю это в обычном цикле for, но я уверен, что есть лучший и более быстрый способ.

n = 100
testdata <- as.data.frame(cbind(runif(n,1,10), runif(n,0,360), runif(n,14,16), runif(n, 46,49)))
colnames(testdata) <- c("speed", "heading", "long", "lat")
head(testdata)

diffmatrix <- as.data.frame(matrix(ncol = 3, nrow = dim(testdata)[1] - 1))
colnames(diffmatrix) <- c("distance","heading_diff","speed_diff")

for (i in 1:(dim(testdata)[1] - 1)) {
  diffmatrix[i,1] <- spDists(as.matrix(testdata[i:(i+1),c('long','lat')]),
                             longlat = T, segments = T)*1000
  diffmatrix[i,2] <- testdata[i+1,]$heading - testdata[i,]$heading
  diffmatrix[i,3] <- testdata[i+1,]$speed - testdata[i,]$speed
}
head(diffmatrix)

Как бы я это сделал с функцией apply?

Или вообще возможно сделать этот расчет параллельно?

Большое спасибо!

1 Ответ

0 голосов
/ 02 мая 2018

Я не уверен, что вы хотите сделать с конечным условием, но с 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. Вы можете не указывать это, если хотите весь массив данных.

...