如何使用R中的data.table构建变更表?

如何使用R中的data.table构建变更表?,r,data.table,R,Data.table,鉴于以下数据: library(data.table) demo <- data.table(ID = c("A", "A", "A", "A","A", "B", "B","B", "C","C","C", "D", "D"), Year = c(2011, 2012, 2013, 2014, 2015, 2012, 2013, 2015, 201

鉴于以下数据:

library(data.table)

demo <- data.table(ID = c("A", "A", "A", "A","A", "B", "B","B", "C","C","C", "D",
                  "D"),
           Year = c(2011, 2012, 2013, 2014, 2015, 
                    2012, 2013, 2015,
                    2013, 2014, 2015,
                    2013, 2015))
然后尝试手动计算每年之间的变化。生成的表格将类似于下面的红色表格


然而,如果有很多年的时间,一个规划性的解决方案将更加高效和干净。我想知道这样的事情是否可能(没有for循环)。

我们很快就能得到所需的值。一个选项可以是更改回
data.frame
,并在
演示
上以宽格式执行矩阵运算(
减法

library(data.table)
demo[, Value := 1]
DT <- dcast(demo, ID ~ Year, value.var = "Value", fill = 0) 
# change back to data.frame to use matrix operation
setDF(DT)

#matrix operation with a column shift
cbind(DT[1], DT[,3:6] - DT[,2:5])
#   ID 2012 2013 2014 2015
# 1  A    0    0    0    0
# 2  B    1    0   -1    1
# 3  C    0    1    0    0
# 4  D    0    1   -1    1
库(data.table)
演示[,值:=1]

DT您应该始终以长格式使用data.table

demo[, val := 1]
#add missing years for IDs:
demo <- demo[CJ(ID = unique(ID), Year = unique(Year)), on = .(ID, Year)]
demo[is.na(val), val := 0L]
#calculate differences:
demo <- demo[, .(Years = paste(head(Year, -1), tail(Year, -1), sep = "-"),
         Diff = diff(val)), by = ID]
dcast(demo, ID ~ Years)
#   ID 2011-2012 2012-2013 2013-2014 2014-2015
#1:  A         0         0         0         0
#2:  B         1         0        -1         1
#3:  C         0         1         0         0
#4:  D         0         1        -1         1
demo[,val:=1]
#为ID添加缺少的年份:
演示
library(data.table)

demo <- data.table(ID = c("A", "A", "A", "A","A", "B", "B","B", "C","C","C", "D",
                  "D"),
           Year = c(2011, 2012, 2013, 2014, 2015, 
                    2012, 2013, 2015,
                    2013, 2014, 2015,
                    2013, 2015))
demo[, val := 1]
#add missing years for IDs:
demo <- demo[CJ(ID = unique(ID), Year = unique(Year)), on = .(ID, Year)]
demo[is.na(val), val := 0L]
#calculate differences:
demo <- demo[, .(Years = paste(head(Year, -1), tail(Year, -1), sep = "-"),
         Diff = diff(val)), by = ID]
dcast(demo, ID ~ Years)
#   ID 2011-2012 2012-2013 2013-2014 2014-2015
#1:  A         0         0         0         0
#2:  B         1         0        -1         1
#3:  C         0         1         0         0
#4:  D         0         1        -1         1