2016-10-06 40 views
1

我正在嘗試計算x在組y上的唯一值。R中的聚合方式太長了

這是函數:

aggregate(x~y,z[which(z$grp==0),],function(x) length(unique(x))) 

這是服用了太多的時間(〜6小時,還沒有完成)。我不想停止處理,因爲我今晚必須完成這個任務。

by()時間太長以及

任何想法什麼錯誤,我怎麼能減少處理時間約1小時? 我的數據集有3百萬行和16列。

輸入數據框ž

x y grp 
1 1 0 
2 1 0 
1 2 1 
1 3 0 
3 4 1 

我想要得到的計數獨特(x)的每個y其中GRP = 0

UPDATE:使用@ EDDI的出色答卷。我有

    x     y 
    1:   2     1 
    2:   1     3 

任何想法如何快速總結這是每個值y的x的數量? 所以對於這一點,將是

Number of x y 
5    1 
1    3 
+0

發佈一個最小可重現的例子,有人會給你一個答案,在一分鐘內運行良好。 – eddi

+0

提供輸入和預期輸出。這樣可以讓你理解你正在努力完成什麼。 – user5249203

+4

已知在數據框中'aggregate()'的公式方法較慢。但我敢打賭,你現在可以停下來,並使用* data.table *包,而仍然按時完成。但是,可重複的例子。 –

回答

3

在這裏你去:

library(data.table) 
setDT(z) # to convert to data.table in place 

z[grp == 0, uniqueN(x), by = y] 
# y V1 
#1: 1 2 
#2: 3 1 
+0

謝謝! 我收到一個錯誤消息,說z.grp是一個連接到雙i.v1的因素。當我檢查typeof(z $ grp)它仍然說整數(0)。 我使用as.numeric(as.character(z $ grp))將grp轉換爲整數,現在正在運行代碼! –

+0

我不知道爲什麼你會得到這個錯誤,因素與否。無論哪種方式,使用'as.integer(as.character',而不是'as.numeric(as.character')來轉換爲整數。 – eddi

+0

謝謝你會的。並且爲了總結而不是唯一計數'z [grp == 0, sum(x),by = y]'will do,right?@eddi –

0
library(dplyr) 
z %>% 
    filter(grp == 0) %>% 
    group_by(y) %>% 
    summarize(nx = n_distinct(x))) 

dplyr方式,雖然它可能不會像快data.table