新数据帧是否具有重复测量的第一个和最后一个值之间的差异?

时间:2013-07-13 00:21:13

标签: r

我正在处理时间序列数据,并希望计算第一次和最终测量时间之间的差异,并将这些数字放入一个新的更简单的数据帧中。例如,对于此数据框

structure(list(time = c(1L, 2L, 3L, 4L, 1L, 2L, 3L, 4L), indv = c(1L, 
1L, 1L, 1L, 2L, 2L, 2L, 2L), value = c(1L, 3L, 5L, 8L, 3L, 4L, 
7L, 8L)), .Names = c("time", "indv", "value"), class = "data.frame", row.names = c(NA, 
-8L))

time    indv    value
1   1   1
2   1   3
3   1   5
4   1   8
1   2   3
2   2   4
3   2   7
4   2   8

我可以使用此代码

ddply(test, .(indv), transform, value_change = (value[length(value)] - value[1]), time_change = (time[length(time)] - time[1]))

给予

time indv value value_change time_change
1    1     1            7           3
2    1     3            7           3
3    1     5            7           3
4    1     8            7           3
1    2     3            5           3
2    2     4            5           3
3    2     7            5           3
4    2     8            5           3

但是,我想消除冗余行并创建一个像这样的新的更简单的数据框

indv    time_change value_change
1   3   7
2   3   5

有没有人有任何聪明的方法来做到这一点?

谢谢!

1 个答案:

答案 0 :(得分:2)

只需将transform替换为summarize即可。您还可以使用headtail

使代码更漂亮
ddply(test, .(indv), summarize,
      value_change = tail(value, 1) - head(value, 1),
      time_change  = tail(time,  1) - head(time,  1))

为了最大限度地提高可读性,请编写一个函数:

change <- function(x) tail(x, 1) - head(x, 1)
ddply(test, .(indv), summarize, value_change = change(value),
                                time_change  = change(time))