R data.table按gr和day分组将j列值汇总为向量列表的实现方法
data.table分组汇总为列表列解决方案
直接使用如下代码即可实现需求:
library(data.table) dat = data.table(j = c(3,8,9,11,10,28, 5), gr = c(9,9,9,9,10,10, 10), day = c(1,1,2,2,1,1,2)) res_dat <- dat[, .(all_values = list(j)), by = .(gr, day)]
结果验证
打印结果默认会显示向量元素用逗号分隔,和预期展示格式一致:
> res_dat gr day all_values 1: 9 1 3,8 2: 9 2 9,11 3: 10 1 10,28 4: 10 2 5
可以通过以下代码验证列类型符合要求:
# 验证all_values是列表类型列 > class(res_dat$all_values) [1] "list" # 验证每个元素是存储j值的数值向量 > class(res_dat$all_values[[1]]) [1] "numeric" > res_dat$all_values[[1]] [1] 3 8
原写法问题说明
- 写法
dat[, j[1:.N], by = .(gr, day )]会将分组内的每个j值拆分为单独行返回,不会聚合为单个向量存储 - 写法
dat[, list(j[1:.N]), by = .(gr, day )]本质和上述写法逻辑一致,无法生成预期的列表列 - 用到Reduce的写法属于冗余操作,不需要累加拼接,分组后的j本身就是当前组的所有取值向量,直接用
list()包裹即可将整个向量作为列表的单个元素,生成目标列表列
内容的提问来源于stack exchange,提问作者User2321
相关产品推荐
相关产品推荐

