2017-08-01 3 views
1

Ist es möglich, mit einem Komplement in R data.tables zu aggregieren. Beispiel unten.R, Komplement bei aggregierender Daten.Tabelle

library(data.table) 
dt <- data.table(a=c("word1","word2","word2","word2"), b=c("cat1","cat1","cat1","cat2")) 

Um Anzahl von bestimmten Wörtern in einer Kategorie

newdt <- dt[,(.N),by=.(a,b)] 
#word1,cat1 - 1 
#word2,cat1 - 2 
#word2,cat2 - 1 

zu bekommen Wie konnte ich die Anzahl aller anderen Worten in der Kategorie zählen? Oder ähnlich, Anzahl der anderen Kategorien, in denen das Wort ist? Etwas wie das Folgende?

#doesn't work 
#newdt2 <- dt[a!=a,(.N),by=.(a,b)] 
#the expected answer would be 
#word1,cat1 - 2 
#word2,cat1 - 1 
#word2,cat2 - 0 

Ich kann keine Hilfe zu diesem Thema in Online-Tutorials oder Fragen finden. Gibt es einen einfachen Weg, um die Ergänzung zu bekommen? Data.table-Lösung wäre schön, wenn man mit einer 50M-Reihentabelle arbeitet. Vielen Dank!

+1

Es ist nicht klar über die Anforderung – akrun

+3

Ja, ich habe auch keine Ahnung, was ist die Frage geht. Auch Ihr Beispiel ist nicht reproduzierbar. Haben Sie versucht, Ihren eigenen Code auszuführen? –

+0

Ich verstehe es nicht ... sollte 'word2, cat2' nicht 2 sein? – Sotos

Antwort

3

die Idee Bruno Nach der Differenz der Gesamtzahl pro Kategorie minus der Anzahl der Worte in jeder Kategorie zu berechnen, aber data.table Syntax mit einem Update mit auf beitreten dies wird zu einem " Einzeiler ":

library(data.table) 
dt <-data.table(a = c("word1", rep("word2", 3L)), b = c(rep("cat1", 3L), "cat2")) 
dt[, .N, by = .(a, b)][dt[, .N, by = b], on = "b", Nc := i.N - N][] 
 a b N Nc 
1: word1 cat1 1 2 
2: word2 cat1 2 1 
3: word2 cat2 1 0 
+0

Nun, das ist noch besser! Übrigens danke für die Formatierungsverbesserung;) –

+0

Danke! Ich habe eine Menge über data.tables zu lernen, aber das ist in der Tat sehr präzise und absolut notwendig. Danke vielmals! – puslet88

+1

@ puslet88 Zum Lernen von data.table empfehle ich die Vignetten und die FAQ auf https://github.com/Rdatatable/data.table/wiki/Getting-started und Kapitel 3 von Franks * Quick R Tutorial * https: // franknarf1.github.io/r-tutorial/_book/ – Uwe

3

Im folgenden ist der Code (Ich habe doppelte Anführungszeichen hinzugefügt, damit es läuft):

library(data.table) 
dt <- 
data.table(a=c("word1","word2","word2","word2"),b=c("cat1","cat1","cat1","cat2")) 

newdt <- dt[,(.N),by=.(a,b)] 
names(newdt) = c("a", "b", "cnt") # rename the count column 

Die folgende Zeile wird zählen, wie oft jeder Kategorie

catCnt = dt[,(.N),by=.(b)] 
names(catCnt) = c("b", "tot_b") 
catCnt 

Die Anzahl der Wörter erscheint zu jeder Kategorie gehörend, mit Ausnahme des aktuellen Wortes, ist die Differenz zwischen der Anzahl der Wörter, die zu der Kategorie gehören, und der Anzahl, wie oft das Paar erscheint (category, word). Um das Ergebnis achive ich fusionieren die beiden data.table Objekte der Kategorie Spalte

aux = merge(newdt, catCnt, by="b") 

und dann berechnen ich die Differenz zwischen der Gesamtzahl und dem „Paar“ zählen:

aux$cnt_not_a = aux$tot_b - aux$cnt 

Wenn Sie möchten, halten Sie die gewünschte Spalte nur:

res = aux[, c("b", "a", "cnt_not_a")] 
res 

ich weiß nicht, wenn Sie dies durch die Verwendung data.table Befehle erreichen können, aber Das sieht mir ganz einfach ...

+0

Vielen Dank! Der Schritt-für-Schritt-Ansatz ist in der Tat der Weg zu gehen, wenn man Dinge zählt, und wir haben das Problem gelöst, vielen Dank!Ich werde die Antwort auf Uwe's noch präzisere Antwort für zukünftige Referenz ticken. – puslet88

+0

In Fällen wie diesem ist es im Allgemeinen sicher, die Frage des OP zu bearbeiten, um Tippfehler zu beheben, denke ich (wie das Hinzufügen dieser Anführungszeichen). – Frank

Verwandte Themen