我正在尝试聚合data.table中的数据以创建一个新列,该列是以前的行列表.通过示例更容易看到:
dt <- data.table(id = c(1,1,1,1,2,2,3,3,3), letter = c('a','a','b','c','a','c','b','b','a'))
Run Code Online (Sandbox Code Playgroud)
我希望以这样的方式聚合它,结果应该是
id letter
1: 1 a,a,b,c
2: 2 a,c
3: 3 b,b,a
Run Code Online (Sandbox Code Playgroud)
直觉我试过了
dt[,j = list(list(letter)), by = id]
Run Code Online (Sandbox Code Playgroud)
但这不起作用.当我逐个案例时,奇怪的是,例如:
> dt[id == 1,j = list(list(letter)), by = id]
id V1
1: 1 a,a,b,c
Run Code Online (Sandbox Code Playgroud)
结果很好......我觉得我错过了.SD
某个地方或类似的东西......
任何人都能指出我正确的方向吗?
谢谢!
这类似于kdb中更多(20x)更快的ungroup函数.
我正在寻找一个类似(但速度更快)的函数,假设data.table包含多个列表列,每个列在每行上具有相同数量的元素,将扩展data.table.
这是这篇文章的延伸.
library(data.table)
library(tidyr)
t = Sys.time()
DT = data.table(a=c(1,2,3),
b=c('q','w','e'),
c=list(rep(t,2),rep(t+1,3),rep(t,0)),
d=list(rep(1,2),rep(20,3),rep(1,0)))
print(DT)
a b c d
1: 1 q 2016-01-09 09:55:14,2016-01-09 09:55:14 1,1
2: 2 w 2016-01-09 09:55:15,2016-01-09 09:55:15,2016-01-09 09:55:15 20,20,20
3: 3 e
print(unnest(DT))
Source: local data frame [5 x 4]
a b c d
(dbl) (chr) (time) (dbl)
1 1 q 2016-01-09 09:55:14 1
2 1 q 2016-01-09 09:55:14 1
3 2 w 2016-01-09 09:55:15 20
4 …
Run Code Online (Sandbox Code Playgroud)