我正在处理时间序列数据,并希望计算第一次和最终测量时间之间的差异,并将这些数字放入一个新的更简单的数据帧中。例如,对于此数据框
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
有没有人有任何聪明的方法来做到这一点?
谢谢!
答案 0 :(得分:2)
只需将transform
替换为summarize
即可。您还可以使用head
和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))