Tho*_*ing 10 nested r unnest data.table
假设我们有一个data.table带有嵌套列的val
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)\nRun 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\nRun Code Online (Sandbox Code Playgroud)\n我想要unnest专栏val,其中可能的选项是使用tidyr::unnest,即
> 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\nRun Code Online (Sandbox Code Playgroud)\n我想知道我们是否可以通过使用data.table唯一的.
注意列中值的顺序grp,我想保留类似的顺序1,2,1,3,4而不是1,1,2,3,4。
data.table尝试我的尝试如下
\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\nRun 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\nRun Code Online (Sandbox Code Playgroud)\n但我想可能有一些更简洁和优雅的方法来做到这一点,例如,不创建辅助列id或使用rep+ lengths。
任何想法?非常感激!
\n还有一种选择:
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))]更整洁。
没有像这样的组的另一种选择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