我有一个以下格式的数据集:
person surveyDate value
a 2006 35
a 2009 44
b 2005 24
b 2007 38
c 2006 51
c 2007 52
c 2009 49
Run Code Online (Sandbox Code Playgroud)
...我希望将其重塑为以下内容:
person dateDiff valueDiff
a 3 9
b 2 14
c 3 -2
Run Code Online (Sandbox Code Playgroud)
...其中dateDiff是每个人的最早和最新调查日期之间的差异,而valueDiff是每个人的最早和最新值之间的差异.请注意,有些人的调查比其他人更多,调查之间的时间也各不相同.
我一直试图用data.table(和melt/ dcast)来做这个,但是尝试使用:=in 来分配新的列值j让我完全陷入困境.其他方法是受欢迎的.速度不是一个大问题,因为数据集不是很大.
你可以做
DT[, .SD[.N] - .SD[1], by = person]
# person surveyDate value
# 1: a 3 9
# 2: b 2 14
# 3: c 3 -2
Run Code Online (Sandbox Code Playgroud)
如果一个组只有.N==1观察值,那么差异将显示为零.
或者......
DT[, lapply(.SD, function(x) x[.N]-x[1]), by = person]
Run Code Online (Sandbox Code Playgroud)
OP报告的速度要快得多.