【发布时间】:2019-09-05 15:08:40
【问题描述】:
我目前有一个大型数据表,我想累积一个 vector 列(classes 列)为每个组 (id) 多年来以矢量格式获取到当前年份的所有过去课程。
编辑: 以前的主题(ie Cumulatively paste (concatenate) values grouped by another variable)在我不想要的 字符连接 的情况下回答了这个问题(因为分析字符串迫使我之前解析它,这在大型数据集上是计算机密集型的)。我想累积向量并获得一列向量。我认为解决方案非常接近,但我无法找到正确的语法。
样本数据:
id year classes
----------------------------
1 2000 c("A", "B")
1 2001 c("C", "A")
1 2002 "D"
1 2003 "E"
2 2001 "A"
2 2002 c("A", "D")
2 2003 "E"
...
预期输出:
id year classes cumclasses
-----------------------------------------------------------
1 2000 c("A", "B") c("A", "B")
1 2001 c("C", "A") c("A", "B", "C", "A")
1 2002 "D" c("A", "B", "C", "A", "D")
1 2003 "E" c("A", "B", "C", "A", "D", "E")
2 2001 "A" "A"
2 2002 c("A", "D") c("A", "A", "D")
2 2003 "E" c("A", "A", "D", "E")
...
我的目标是找到一个高效的解决方案,因为我的数据集相当大。
现在我有一个使用 dplyr 和 purrr 的工作(但超慢)解决方案:
dt2 <- dt %>%
setkeyv(c("id", "year")) %>%
group_by(id) %>%
mutate(cumclasses = accumulate(classes, append))
我正在寻找以下类型的 data.table 解决方案:
#not working example
dt2 <- dt[, cumclasses := accumulate(classes, append), by = id]
甚至是基础 R 解决方案,越快越好!
谢谢!
如果您想重现示例数据,请复制以下代码:
dt <- data.table(id = c(1,1,1,1,2,2,2), year = c(2000,2001,2002,2003,2001,2002,2003), classes = list(c('A', 'B'), c('C', 'A'), 'D', 'E', 'A', c('A', 'D'), 'E'), key = 'id')
编辑 [已解决]:
一个可行的解决方案是(使用data.table 和purrr):
dt[, cumClasses := list(accumulate(classes, append)), by = id]
【问题讨论】:
标签: r performance dataframe dplyr data.table