根据嵌套列表融化 data.table

Pav*_*ive 2 r list data.table

我有一个像这样的 data.table:

library(data.table)    
dt <- data.table(a = c(rep("A", 3), rep("B", 3)), b = c(1, 3, 5, 2, 4, 6))
Run Code Online (Sandbox Code Playgroud)

我需要对 each 的值执行操作(预测)a,所以我决定将它们放在一个列表中,如下所示:

dt <- dt[, x := .(list(b)), by = a][, .SD[1,], by = a, .SDcols = "x"]
Run Code Online (Sandbox Code Playgroud)

现在我想“融化”(这是我想到的东西)dt回到原来的形式。

我可以在很少的级别上做到这a一点:

dt2 <- rbind(expand.grid(dt[1, a], dt[1, x[[1]]]), expand.grid(dt[2, a], dt[2, x[[1]]]))
Run Code Online (Sandbox Code Playgroud)

但当然,该解决方案对于更多级别的a.

我试过了

dt2 <- dt[, expand.grid(a, x[[1]]), by = a]
Run Code Online (Sandbox Code Playgroud)

这导致

dt2
##    a Var1 Var2
## 1: A    A    1
## 2: A    A    3
## 3: A    A    5
## 4: B    A    2
## 5: B    A    4
## 6: B    A    6
Run Code Online (Sandbox Code Playgroud)

有趣的是,Var1它实际上并没有遵循预期的“A - B”模式(但至少a仍然存在)。

有没有更好的方法来实现这一目标?

编辑

预期输出将是

dt2[, .(a, Var2)]
Run Code Online (Sandbox Code Playgroud)
  • 更正了“dcast”的“melt”。

Psi*_*dom 5

您正在寻找一种以data.table 方式nest(将列从原子向量类型转换为列表类型)和unnest(相反方向)的方法。这不同于spread将列值重塑为行标题(dcast)或gather将行标题重塑为列值(melt)的数据:

在 data.table 语法中,您可以在目标列上使用listunlist将其与组变量一起汇总或广播:

假设我们从以下开始:

dt
#    a b
# 1: A 1
# 2: A 3
# 3: A 5
# 4: B 2
# 5: B 4
# 6: B 6
Run Code Online (Sandbox Code Playgroud)

要重复您在第一步中取得的成就,即nestcolumn b,您可以执行以下操作:

dt_nest <- dt[, .(b = list(b)), a]
dt_nest
#    a     b
# 1: A 1,3,5
# 2: B 2,4,6
Run Code Online (Sandbox Code Playgroud)

要反其道而行之,请unlist与组变量一起使用:

dt_nest[, .(b = unlist(b)), a]
#    a b
# 1: A 1
# 2: A 3
# 3: A 5
# 4: B 2
# 5: B 4
# 6: B 6
Run Code Online (Sandbox Code Playgroud)