我有一个非常大的问题,并通过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的大小对我来说太大了.
我认为这可能有效:
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)
如果我们使用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)
| 归档时间: |
|
| 查看次数: |
764 次 |
| 最近记录: |