如何使用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