有没有更简洁的“data.table”方法来取消 data.table 中的嵌套列?

Tho*_*ing 10 nested r unnest data.table

假设我们有一个data.table带有嵌套列的val

\n
dt <- data.table(\n  grp = c(1, 2, 1, 3, 4),\n  val = list("a", c("b", "c"), c("d", "e", "f"), "g", c("h", "i"))\n)\n
Run Code Online (Sandbox Code Playgroud)\n

显示为

\n
> dt\n   grp   val\n1:   1     a\n2:   2   b,c\n3:   1 d,e,f\n4:   3     g\n5:   4   h,i\n
Run Code Online (Sandbox Code Playgroud)\n
\n

问题

\n

我想要unnest专栏val,其中可能的选项是使用tidyr::unnest,即

\n
> dt %>%\n+   unnest(val)\n# A tibble: 9 \xc3\x97 2\n    grp val\n  <dbl> <chr>\n1     1 a\n2     2 b\n3     2 c\n4     1 d\n5     1 e\n6     1 f\n7     3 g\n8     4 h\n9     4 i\n
Run Code Online (Sandbox Code Playgroud)\n

我想知道我们是否可以通过使用data.table唯一的.

\n

注意列中值的顺序grp,我想保留类似的顺序1,2,1,3,4而不是1,1,2,3,4

\n
\n

我的data.table尝试

\n

我的尝试如下

\n
> dt[, id := .I][, lapply(.SD, unlist), id][, id := NULL][]\n   grp val\n1:   1   a\n2:   2   b\n3:   2   c\n4:   1   d\n5:   1   e\n6:   1   f\n7:   3   g\n8:   4   h\n9:   4   i\n
Run Code Online (Sandbox Code Playgroud)\n

或者

\n
> dt[,.(grp = rep(grp,lengths(val)), val = unlist(val))]\n   grp val\n1:   1   a\n2:   2   b\n3:   2   c\n4:   1   d\n5:   1   e\n6:   1   f\n7:   3   g\n8:   4   h\n9:   4   i\n
Run Code Online (Sandbox Code Playgroud)\n

但我想可能有一些更简洁和优雅的方法来做到这一点,例如,不创建辅助列id或使用rep+ lengths

\n

任何想法?非常感激!

\n

sin*_*dur 8

还有一种选择:

dt[, .(grp, val = unlist(val)), by = .I][, !"I"]
#      grp    val
#    <num> <char>
# 1:     1      a
# 2:     2      b
# 3:     2      c
# 4:     1      d
# 5:     1      e
# 6:     1      f
# 7:     3      g
# 8:     4      h
# 9:     4      i
Run Code Online (Sandbox Code Playgroud)

附言。如果您使用的是 data.table1.4.2或更旧的版本by = .I将不起作用。相反,您可以使用:

dt[, .(grp, val = unlist(val)), by = 1:nrow(dt)][, !"nrow"]
Run Code Online (Sandbox Code Playgroud)

PS2。我觉得你的dt[,.(grp = rep(grp,lengths(val)), val = unlist(val))]更整洁。


Qui*_*ten 7

没有像这样的组的另一种选择by

library(data.table)
dt[rep(1:.N, lengths(val))][, val:=unlist(dt$val)][]
#>    grp val
#> 1:   1   a
#> 2:   2   b
#> 3:   2   c
#> 4:   1   d
#> 5:   1   e
#> 6:   1   f
#> 7:   3   g
#> 8:   4   h
#> 9:   4   i
Run Code Online (Sandbox Code Playgroud)

创建于 2022-09-16,使用reprex v2.0.2