В R вычтите значение из предыдущей строки во фрейме данных на основе иерархической структуры данных
Мне нужно вычислить следующее уравнение в новом столбце в моем фрейме данных.
Индекс относительного смещения: |{(нетто-смещение l-нетто-смещение l+1)/ нетто-смещение l}*100|, где мне нужно вычислить абсолютное значение нетто-смещения между GPS-местоположением l и местоположением l + 1. Полученное число будет быть процентным значением.
У меня проблема в том, что я не могу найти простой способ вставить формулу выше, где я вычисляю относительное изменение амплитуды чистого смещения от строки 1 к строке 2, строки 2 к строке 3, строки 3 к строке 4 и т. Д. Я включил пример фрейма данных для вашей справки. Я также включил столбец во фрейм данных, который содержит желаемый результат. Данные имеют иерархическую структуру (местоположения GPS вложены в COLLAR_ID, DATETIME, MONTH, DAY, YEAR и HOUR.
dput(droplevels(head(example, 4)))
structure(list(COLLAR_ID = c(33827L, 33827L, 33827L, 33827L),
DATETIME = structure(1:4, .Label = c("10/1/2013 10:00", "10/1/2013 10:30",
"10/1/2013 17:00", "10/1/2013 17:30"), class = "factor"),
WEEK = c(1L, 1L, 1L, 1L), YEAR = c(2013L, 2013L, 2013L, 2013L
), MONTH = c(10L, 10L, 10L, 10L), DAY = c(1L, 1L, 1L, 1L),
HOUR = c(10L, 10L, 17L, 17L), X = c(384349L, 431753L, 242501L,
448158L), Y = c(8864608L, 8757741L, 7306632L, 1159880L),
MOVEMENT_DISTANCE = c(78.1, 99.82, 35.9, 3), NET_DISPLACEMENT = c(135.35,
205.65, 403.79, 434.83)), .Names = c("COLLAR_ID", "DATETIME","WEEK", "YEAR","MONTH","DAY", "HOUR", "X", "Y", "MOVEMENT_DISTANCE","NET_DISPLACEMENT"), row.names = c(NA, 4L), class = "data.frame")
1 ответ
Мы можем использовать lead
функция из пакета dplyr. Предполагая, что ваш фрейм данных называется dat
, dat2
это окончательный результат.
library(dplyr)
dat2 <- dat %>%
mutate(RDI = abs((NET_DISPLACEMENT - lead(NET_DISPLACEMENT))/NET_DISPLACEMENT * 100))
head(dat2$RDI)
# [1] 51.9394163 96.3481644 7.6871641 0.5128441 1.2020342 0.3243490
Вы также можете использовать базу R следующим образом.
dat3 <- dat
dat3$RDI <- with(dat, abs((NET_DISPLACEMENT - c(NET_DISPLACEMENT[-1], NA))/NET_DISPLACEMENT * 100))
head(dat3$RDI)
# [1] 51.9394163 96.3481644 7.6871641 0.5128441 1.2020342 0.3243490