【问题标题】:How to write following aggregate method using data.table?如何使用 data.table 编写以下聚合方法?
【发布时间】:2015-05-11 12:28:12
【问题描述】:

将热门商品列表视为

 ids_of_popular_items <- c('12345678','87654321')

考虑一个数据框input_data 有两列session_iditem_id

  session_id   item_id
1    1806169 643078800
2    1806169 643078800
3    2116064 214840661
4    2116064 214840663
....

如图所示,会话2116064 有两个项目214840661214840661。 现在我想看看这两个项目在整个数据集input_data 中的受欢迎程度。那就是这些项目列表中的table()。因此,每个聚合会话现在将具有属于该会话的项目计数的排序列表。例如如果214840661input_data 中出现100 次,214840661 出现200 次,则会话2116064 的聚合值应该是一个向量(200, 100)。

  session_id   item_counts
1    1806169   (40)
2    2116064   (200, 100)
....

我想只考虑每个会话中ids_of_popular_items 中不存在的那些项目。

我使用aggregate 方法实现了这一点,如下所示(聚合允许为每个聚合记录返回一个列表):

all_popularity <- aggregate(input_data$item_id, 
                            FUN = function(items) {(table(input_data_without_popular$item_id[input_data_without_popular$item_id %in% items]))}, 
                            by = list(yoochoose_predictors$session_id))

但由于数据集的规模很大(大约 200 万行),计算需要花费大量时间。 我使用data.table 进行简单聚合,它的工作速度要快得多。我想知道如何使用data.table 来实现这一点。

【问题讨论】:

    标签: r data.table aggregate


    【解决方案1】:

    你可以试试

    library(data.table)#v1.9.5+
    setDT(input_data)[, .N,.(session_id, item_id)][, 
        list(item_counts=  sprintf('(%s)', toString(N))) , session_id]
    

    更新

    我不确定预期的输出,可能是

    setDT(input_data)[!item_id %chin% ids_of_popular_items][,
            .N,.(session_id, item_id)][, 
            list(item_counts=  sprintf('(%s)', toString(N))) , session_id]
    

    【讨论】:

    • 如何排除ids_of_popular_items中存在的那些项目?
    • @Sangram 抱歉,那些 `ids_of_popular_items 是什么?如果您展示一个具有预期结果的可重现示例会更好
    • @Sangram 没关系,我在帖子开头找到了你的ids_of_popular_items
    • @Sangram 是否要排除与ids_of_popular_items 对应的session_iditem_id
    • 我想从特定会话中“排除”所有项目,其item_id 存在于ids_of_popular_items 中。因此,我只想考虑非热门项目。
    猜你喜欢
    • 1970-01-01
    • 2015-07-20
    • 1970-01-01
    • 2018-07-20
    • 2019-10-15
    • 1970-01-01
    • 2016-02-20
    • 1970-01-01
    • 2013-11-19
    相关资源
    最近更新 更多