如何使用data.table编写以下聚合方法?

时间:2015-05-11 12:28:12

标签: r data.table aggregate

考虑一下热门项目列表

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

考虑一个包含两列input_datasession_id的数据框item_id

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

如图所示,会话2116064有两个项214840661214840661。 现在我想看看这两个项目在整个数据集input_data中的受欢迎程度。这是这些项目列表中的table()。因此,每个聚合会话现在将具有属于该会话的项目计数的排序列表。例如如果214840661出现100次而214840661input_data中出现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实现此目的。

1 个答案:

答案 0 :(得分: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]