考虑一下热门项目列表
ids_of_popular_items <- c('12345678','87654321')
考虑一个包含两列input_data
和session_id
的数据框item_id
。
session_id item_id
1 1806169 643078800
2 1806169 643078800
3 2116064 214840661
4 2116064 214840663
....
如图所示,会话2116064
有两个项214840661
和214840661
。
现在我想看看这两个项目在整个数据集input_data
中的受欢迎程度。这是这些项目列表中的table()
。因此,每个聚合会话现在将具有属于该会话的项目计数的排序列表。例如如果214840661
出现100次而214840661
在input_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
实现此目的。
答案 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]