使用data.table扩展数据

Léo*_*ert 2 r data.table

我有这个数据表

library(data.table)

data.table(
  id = c(rep(1, 3), rep(2, 2)),
  begin = c(1, 4, 8, 1, 11),
  end = c(3, 7, 12, 10, 12),
  state = c("A", "B", "A", "B", "A")
)
Run Code Online (Sandbox Code Playgroud)

我想要这个输出:

data.table(
  id = c(1, 2),
  m1 = c("A", "B"),
  m2 = c("A", "B"),
  m3 = c("A", "B"),
  m4 = c("B", "B"),
  m5 = c("B", "B"),
  m6 = c("B", "B"),
  m7 = c("B", "B"),
  m8 = c("A", "B"),
  m9 = c("A", "B"),
  m10 = c("A", "B"),
  m11 = c("A", "A"),
  m12 = c("A", "A")
)
Run Code Online (Sandbox Code Playgroud)

这些谁用来做序列分析可能已经认识到,我想要做什么seqformat做的TRaMiNeR包会做,但具有更高的性能由于使用的data.table

akr*_*run 5

有一种选择data.tablemelt数据集创建序列柱,然后通过“I1”,“ID”,“状态”分组后,得到seq的uence firstlast“价值” dcast从“长”到“宽”

dt1 <- melt(dt[, i1 := seq_len(.N)], id.vars = c("i1", "id", "state"))[,
      paste0("m", seq(first(value), last(value))), .(i1, id, state)]
dcast(dt1, id ~ V1, value.var = "state")[]
#    id m1 m10 m11 m12 m2 m3 m4 m5 m6 m7 m8 m9
#1:  1  A   A   A   A  A  A  B  B  B  B  A  A
#2:  2  B   B   A   A  B  B  B  B  B  B  B  B
Run Code Online (Sandbox Code Playgroud)