在R中,根据分层数据结构

时间:2018-05-23 17:52:23

标签: r gps

我需要在数据框的新列中计算以下等式。

相对位移指数: | {(净排量l-净排量l + 1)/净排量1} * 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")

Example Data Set

1 个答案:

答案 0 :(得分:1)

我们可以使用包中的lead函数。假设您的数据框名为datdat2是最终输出。

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