相关疑难解决方法(0)

data.table聚合到列表列

我正在尝试聚合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某个地方或类似的东西......

任何人都能指出我正确的方向吗?

谢谢!

r data.table

4
推荐指数
1
解决办法
261
查看次数

如何取消组合data.table中的列列?

tidyr提供UNNEST功能,帮助扩大列表列.

这类似于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)

r kdb data.table tidyr

3
推荐指数
1
解决办法
1424
查看次数

标签 统计

data.table ×2

r ×2

kdb ×1

tidyr ×1