2015-05-09 57 views
1

我有一個數據框predictorssession_iditem_id列。使用R中的data.table跟隨聚合方法的等價物是什麼?

我想計算屬於一個特定會話的所有項目的計數(在整個數據框中)。

我已經使用了聚合的方法是這樣的:

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,我希望獲得item1item2的計數列表(在整個predictors數據框中)與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

請顯示一個小數據。例如,與所期望的結果。另外,我建議從新的[簡介data.table](https://github.com/Rdatatable/data.table/wiki/Getting-started)HTML小插圖開始。它應該只需要大約10分鐘... – Arun

回答

2

這裏是實現這一使用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 
..  ...  ... .. 
+0

感謝您的答案..因爲我正在處理大型數據集,我正在考慮使用data.table執行此操作的方法 – Sangram

+1

@Sangram這將適用於數據。 table'。雖然你可能想閱讀[this](http://stackoverflow.com/questions/27511604/dplyr-on-data-table-am-i-really-using-data-table)。 – tchakravarty

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是很多b目視觀察;你不想看到利潤率?

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) 
) 
相關問題