如何使用data.table在R中计算转移表?

4
我在想如何计算状态转换表,以便在引入新的ID(+1)和删除ID(-1)时使用。
例如:
library(data.table)

dt <- data.table(id = c(1,2,3,1,2,3,4,5,1,2,4,5),
           year = c(2015, 2015, 2015, 2016, 2016, 2016, 2016, 2016, 2017, 2017, 2017, 2017))

ids <- unique(dt$id)

所以第一年(2016年),应该是:
0, 0, 0, 1, 1

第二年(2017年)应该是:

0, 0, -1, 0, 0

5
dcast(dt, year ~ id, length, fill = 0L)[, lapply(.SD, diff), .SDcols = -"year"] - David Arenburg
1
tt <- table(dt); tt[ , -1] - tt[ , -ncol(tt)] - Henrik
1
@DavidA 看起来值得回答。使用fun=length时不需要填充fill=0;同时可以保留一个年份列:dcast(dt, year ~ id, length)[, c(.(year = tail(year, -1)), lapply(.SD, diff)), .SDcols = as.character(ids)] - Frank
1个回答

0
这是一个替代方法,它使用交叉连接和聚合连接。它本质上等同于上面的 `dcast()` 和 `table()` 解决方案,但保持数据处于长格式:
dt[CJ(year = year, id = id, unique = TRUE), on = .(id, year), .N, by = .EACHI][
  , change := N - shift(N), by = id][]
    id year N change
 1:  1 2015 1     NA
 2:  2 2015 1     NA
 3:  3 2015 1     NA
 4:  4 2015 0     NA
 5:  5 2015 0     NA
 6:  1 2016 1      0
 7:  2 2016 1      0
 8:  3 2016 1      0
 9:  4 2016 1      1
10:  5 2016 1      1
11:  1 2017 1      0
12:  2 2017 1      0
13:  3 2017 0     -1
14:  4 2017 1      0
15:  5 2017 1      0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接