【问题标题】:Efficient vectors accumulation by group in data frame [duplicate]数据帧中按组的有效向量累积[重复]
【发布时间】: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.tablepurrr):

dt[, cumClasses := list(accumulate(classes, append)), by = id]

【问题讨论】:

    标签: r performance dataframe dplyr data.table


    【解决方案1】:

    一种选择是按“id”分组,遍历行序列并在unlistlist 列之后提取“类”和paste 一起

    dt[,  cumClasses := sapply(seq_len(.N), function(i) toString(unlist(classes[seq_len(i)]))), id][, 
             cumClasses := as.list(cumClasses)][]
    

    【讨论】:

    • 感谢您的回答。但这给了我一列字符,其中值是逗号分隔的,而不是一列向量。
    • @Samsa 好的,我以为你想将它们作为字符串加入。如果您想将其作为vectorst 列表,则删除toString 并将sapply 更改为lapply
    • 写入dt[, cumClasses := lapply(seq_len(.N), function(i) unlist(classes[seq_len(i)])), by = id] 会导致以下错误:Supplied 2 items to be assigned to group 1 of size 4 in column 'cumClasses'. The RHS [...]
    猜你喜欢
    • 1970-01-01
    • 2012-10-13
    • 2021-06-09
    • 1970-01-01
    • 2019-05-05
    • 2016-05-24
    • 2016-05-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多