使用列表列对data.table进行分组

new*_*bie 6 r data.table

我有一个非常大的问题,并通过data.table循环来做我想要的太慢,所以我试图绕过循环.假设我有一个data.table如下:

a <- data.table(i = c(1,2,3), j = c(2,2,6), k = list(c("a","b"),c("a","c"),c("b")))

> a
  i j   k
1: 1 2 a,b
2: 2 2 a,c
3: 3 6   b
Run Code Online (Sandbox Code Playgroud)

我想根据k中的值进行分组.所以像这样:

a[, sum(j), by = k]
Run Code Online (Sandbox Code Playgroud)

现在我收到以下错误:

 Error in `[.data.table`(a, , sum(i), by = k) : 
 The items in the 'by' or 'keyby' list are length (2,2,1). Each must be same length as rows in x or number of rows returned by i (3).
Run Code Online (Sandbox Code Playgroud)

我正在寻找的答案是首先将列k中具有"a"的所有行分组,然后计算sum(j),然后计算所有具有"b"的行,依此类推.所以答案是:

k V1 
a 4
b 8
c 2
Run Code Online (Sandbox Code Playgroud)

任何提示如何有效地做到这一点?我不能通过重复行来融化列K,因为data.table的大小对我来说太大了.

Mik*_* H. 8

我认为这可能有效:

a[, .(k = unlist(k)), by=.(i,j)][,sum(j),by=k]

   k V1
1: a  4
2: b  8
3: c  2
Run Code Online (Sandbox Code Playgroud)


akr*_*run 5

如果我们使用tidyr,则一个紧凑的选择是

library(tidyr)
unnest(a, k)[, sum(j) ,k]
#   k V1
#1: a  4
#2: b  8
#3: c  2
Run Code Online (Sandbox Code Playgroud)

或使用dplyr/tidyr管道

unnest(a, k) %>%
       group_by(k) %>%
       summarise(V1 = sum(j))
#     k    V1
#   <chr> <dbl>
#1     a     4
#2     b     8
#3     c     2
Run Code Online (Sandbox Code Playgroud)