不定期地重新整理和汇总数据

rop*_*der 2 r data.table

我有一个以下格式的数据集:

 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让我完全陷入困境.其他方法是受欢迎的.速度不是一个大问题,因为数据集不是很大.

Fra*_*ank 6

你可以做

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报告的速度要快得多.