【问题标题】:create column with union of ranges by group按组创建具有范围联合的列
【发布时间】:2021-02-18 20:41:24
【问题描述】:

我正在尝试编写代码,最好使用data.table,将数据按id 从具有范围的列表列(my_range)分组到一个新的聚合数据集中,其中包含一个包含联合的列(union_of_my_rangemy_range 的每个 ID。

library(data.table)

#Input
d <- data.table(id=c(1,1,2,2),
                my_range=list(1:5,2:6,3:7,9:9)
                )

#Desired output:
g <- data.table(id=c(1,2),
                union_of_my_range=list(c(1:5,6),c(3:7,9))
                )

最好找data.table解决方案,

这是我目前所拥有的:

d[, .(my_range_union = SOMETING unon my_range ) ,id]

但我无法跟踪聚合步骤中交互的所有列表

【问题讨论】:

    标签: r list group-by data.table range


    【解决方案1】:

    您可以unlistmy_range 值,收集unique 值并将其放入新列表中。

    library(data.table)
    d[, .(my_range_union = list(unique(unlist(my_range)))) ,id]
    
    #   id my_range_union
    #1:  1    1,2,3,4,5,6
    #2:  2    3,4,5,6,7,9
    

    【讨论】:

    • 这很棒。唯一的问题是 unique 有点慢。对this question 的评论提到了“distinct”是如何更快地替代重复数据删除的 data.frames,但在这种情况下它不起作用。
    • distinct 位于 dplyr 而不是 data.table。我在这里使用的unique 用于向量,distinct 用于数据帧/小标题,我认为它不适用于这里。
    【解决方案2】:

    我们可以使用Reduceunion

    d[, .(my_range_union = list(Reduce(union, my_range))), id]
    #   id my_range_union
    #1:  1    1,2,3,4,5,6
    #2:  2    3,4,5,6,7,9
    

    【讨论】:

    • 谢谢,这个解决方案比上面的解决方案更快(1mm 行数据集上的 18s vs 29s)
    猜你喜欢
    • 1970-01-01
    • 2022-08-18
    • 2011-05-12
    • 1970-01-01
    • 1970-01-01
    • 2015-06-19
    • 2012-05-28
    • 1970-01-01
    • 2017-06-09
    相关资源
    最近更新 更多