2

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

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

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

谢谢!

4

1 回答 1

2

只需替换transformsummarize. 您还可以使用headand使您的代码更漂亮tail

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))
于 2013-07-13T00:32:21.283 回答