2016-10-06 2 views
1

Ich versuche, die eindeutigen Werte von x über die Gruppen y zu zählen.Aggregat in R viel zu lange

Dies ist die Funktion:

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

Das ist viel zu lange dauert (~ 6 Stunden und noch nicht geschehen). Ich möchte nicht aufhören zu verarbeiten, da ich heute Abend fertig bin.

by() wurde zu lange dauert auch

Irgendwelche Ideen, was falsch läuft und wie kann ich die Verarbeitungszeit ~ 1 Stunde reduzieren? Mein Datensatz hat 3 Millionen Zeilen und 16 Spalten.

Eingangsdatenrahmen z

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

Ich möchte die Anzahl der einzigartigen (x) für jedes y wo grp = 0

UPDATE bekommen: Mit ausgezeichneten Antwort des @ eddi. Ich habe

    x     y 
    1:   2     1 
    2:   1     3 

Eine Idee, wie kann ich das schnell als die Anzahl der x für jeden Wert y zusammenfassen? hierfür So wird es

Number of x y 
5    1 
1    3 
+0

Geben Sie ein minimales reproduzierbares Beispiel ein, und jemand gibt Ihnen eine Antwort, die in weniger als einer Minute läuft. – eddi

+0

liefern Eingabe und erwartete Ausgabe. So dass es etwas Verständnis gibt, was Sie versuchen zu erreichen. – user5249203

+4

Die Formelmethode von 'aggregate()' ist bekanntermaßen langsamer auf Datenrahmen. Aber ich würde wetten, dass Sie jetzt aufhören könnten und stattdessen das Paket * data.table * verwenden könnten und trotzdem pünktlich fertig sind. Aber ja, reproduzierbares Beispiel. –

Antwort

3

Hier werden Sie gehen:

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

Danke! Ich bekomme einen Fehler, der besagt, dass z.grp ein Faktor ist, der mit einem doppelten i.v1 verknüpft wird. Wenn ich typeof (z $ grp) überprüfe, sagt es immer noch Ganzzahl (0). Ich konvertierte Grp in Ganzzahl mit as.numeric (as.character (z $ grp)) und bin jetzt den Code ausgeführt! –

+0

Ich bin mir nicht sicher, warum Sie diesen Fehler bekommen, Faktor oder nicht. Wie auch immer, benutze 'as.integer (as.character' anstelle von 'as.numeric (as.character ') um in Integer zu konvertieren. – eddi

+0

Danke, tue. Und für das Summieren anstelle der eindeutigen Zählung,' z [grp == 0, sum (x), by = y] 'tun, richtig? @eddi –

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

ist die dplyr Art und Weise, obwohl es nicht so schnell wie data.table sein kann.