在R中使用data.table的以下聚合方法的等价物是什么?

时间:2015-05-09 09:19:33

标签: r data.table aggregate

我有一个名为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)。

e.g。如果有session1 - item1session1 - item2两个记录,我想获取predictorsitem1的计数列表(在整个item2数据框中)反对session1。 (类似于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')]

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

2 个答案:

答案 0 :(得分:2)

以下是使用 if ($count > 0) { if ($row['Password'] == $password){ $_SESSION['status'] = $row['Access']; $_SESSION['name'] = $row['Name']; header('Location: ./Home.php'); } else{ echo "<p id='logInError'>Password incorrect</p>" ; } } else { echo "<p id='logInError'>Username incorrect</p>" ; } 实现此目的的简单方法:

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)

答案 1 :(得分:2)

这里是data.table函数的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

如果您只是运行此代码一次,我认为没有理由更喜欢.Ntable。但是,如果您想要存储它,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)
 )