I have data arranged like this in R:
indv time val
A 6 5
A 10 10
A 12 7
B 8 4
B 10 3
B 15 9
对于每个时间点的个体(indv
),我想要计算从初始时间开始的值(val
)变化。因此,我最终会得到类似这样的结果:
indv time val val_1 val_change
A 6 5 5 0
A 10 10 5 5
A 12 7 5 2
B 8 4 4 0
B 10 3 4 -1
B 15 9 4 5
能否有人告诉我如何实现这个?我可以使用。
ddply(df, .(indv), function(x)x[which.min(x$time), ])
为了获得像这样的表格:
indv time val
A 6 5
B 8 4
然而,我无法找出如何创建一个名为val_1
的列,使每个个体的最小值能够匹配。但是,如果我能做到这一点,我应该能够使用类似以下代码添加val_change
列:
df['val_change'] = df['val_1'] - df['val']
编辑:下面发布了两种优秀的方法,但两种方法都依赖于我的时间列已经排序,以便小的时间值在高的时间值之上。我不确定我的数据总是这种情况。(我知道我可以先在Excel中进行排序,但我想避免这样做)。如果表格出现这种情况,我该怎么办:
indv time value
A 10 10
A 6 5
A 12 7
B 8 4
B 10 3
B 15 9
val
排序或按time
排序,无论你想要哪一种。先对数据框进行排序比在差分操作中处理它要容易得多。 - Gavin Simpsonlapply
函数中执行以下操作,例如val_1+val_change
。并将其赋值给变量new_val
。 - dondapati