【问题标题】:What is the equivalent of following aggregate method using data.table in R?在 R 中使用 data.table 的以下聚合方法的等价物是什么?
【发布时间】:2015-07-20 05:12:21
【问题描述】:

我有一个名为predictors 的数据框,其列为session_iditem_id

我想计算属于一个特定会话的所有项目的计数(在整个数据框中)。

我使用过这样的聚合方法:

popularity <- aggregate(predictors$item_id, 
                        FUN = function(items) {(table(predictors$item_id[predictors$item_id %in% items]))}, 
                        by = list(predictors$session_id))

它基本上计算属于一个特定会话的所有项目的计数列表(通过predictors)。

例如如果有两条记录为session1 - item1session1 - item2,我想获取item1item2session1 的计数列表(在整个predictors 数据帧中)。 (类似于session1 - (10, 20),当item1 在数据集中出现10 次时,等等)。

我使用上面的aggregate 方法得到这个。但我想使用data.table 让它更快地工作。

到目前为止,我已经尝试使用 data.table 如下:

predictors_data.table <- data.table(predictors)
popularity <- predictors_data.table[ , list(p = table(predictors_data.table$item_id[items_list %in% item_id])), 
                                       by = c('session_id')]

但我只计算第一个项目,而不是一个特定会话的所有项目。

【问题讨论】:

  • 请展示一个小的示例数据,以及想要的结果。另外我建议从新的Introduction to data.table HTML 小插图开始。它应该只需要大约 10 分钟...

标签: r data.table aggregate


【解决方案1】:

这是使用dplyr 实现此目的的简单方法:

# devtools::install_github("trinker/wakefield")
library(wakefield)

wakefield::r_data_frame(n = 1000,
  session_id = r_sample(x = 1:10),
  item_id = r_sample(x = 1:10)
) %>%
  dplyr::count(item_id, session_id)

它给出了输出:

Source: local data frame [100 x 3]
Groups: item_id

   item_id session_id  n
1        1          1  7
2        1          2 12
3        1          3 14
4        1          4  6
5        1          5 14
6        1          6  9
7        1          7  8
8        1          8  4
9        1          9  9
10       1         10  6
..     ...        ... ..

【讨论】:

  • 感谢您的回答..因为我正在处理一个大型数据集,我正在考虑使用 data.table 来做到这一点
  • @Sangram 这适用​​于data.table。不过,您可能想阅读this
【解决方案2】:

这是table 函数的data.table 类似物:

predictors_data.table[,.N,by=c("session_id","item_id")]
#    session_id item_id   N
# 1:          1       1 106
# 2:          1       2  99
# 3:          1       3 115
# 4:          2       1 121
# 5:          2       2 110
# 6:          2       3 115
# 7:          3       1 122
# 8:          3       2 103
# 9:          3       3 109

但是,table 在视觉上要好得多;你不想看到边距吗?

with(predictors,table(session_id,item_id))
# or...
with(predictors_data.table,table(session_id,item_id))
#           item_id
# session_id   1   2   3
#          1 106  99 115
#          2 121 110 115
#          3 122 103 109

如果您只运行此代码一次,我认为没有理由更喜欢 .N 而不是 table。不过,如果您想存储它,predictors_data.table[,count:=.N,by=c("session_id","item_id")] 会很方便。


示例数据,复制@fgnu:

 require(wakefield)
 set.seed(1)
 predictors <- wakefield::r_data_frame(
   n = 1000,
   session_id = r_sample(x = 1:3),
   item_id = r_sample(x = 1:3)
 )

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-06-19
    • 2019-12-14
    • 1970-01-01
    • 1970-01-01
    • 2011-01-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多