2016-04-08 11 views
1

Ich habe einen großen Datensatz (mehrere Millionen Zeilen) als data.table gespeichert (Ich lerne derzeit, das Paket zu verwenden). Es ist in einem Format wie folgt aus (nur die relevanten Spalten):mit data.table zu unterteilen und aggregieren effizient

DT=data.table("a"=c(11,11,11,12,13,13),"b"=c("x", "y", "z", "y", "x", "y")) 
DT 
    a b 
1: 11 x 
2: 11 y 
3: 11 z 
4: 12 y 
5: 13 x 
6: 13 y 

ich eine Funktion zu bauen bin versucht, die in „a“ auf der Eingabe der Wert basiert, findet alle mit ihm in „b“ zugeordnet Werte (Liste A), und durchsucht dann die übrigen Werte in "a" und gibt denjenigen zurück, der die meisten Werte in "b" hat, der mit Einsen in Liste A übereinstimmt.

z für a = 11 ist die Liste A "x, y, z", für a = 13 ist die Liste A "x, y" das gewünschte Ergebnis für a = 13 ist a = 11 (passt auf 2 Werte - "x, y ")

Ich versuche, den effizientesten Weg zu finden, dies zu tun. , was ich versuchte, so weit ist:

toMatch=3 
setkey(DT,a) 
vals=DT[list(toMatch)]$b 

vals 
[1] "x" "y" 

setkey(DT,b) 
temp=data.table("listA"=DT[list(vals)]$a) 
temp[,.N, by = names(temp)][order(-N)] 

temp 
    listA N 
1:  11 2 
2:  31 2 
3:  21 1 

best=temp[listA!=toMatch][1] 
    listA 
1: 11 

Dies gibt das gewünschte Ergebnis, erfordert aber den Schlüssel zurückzusetzen oder den Bau Hilfstabellen (die nicht durchführbar jedes Mal ist), jeder mit seinem eigenen Schlüssel. Wie bereits erwähnt, lerne ich erst jetzt data.table - ich bin sicher, dass es einen effizienteren Weg gibt, dies zu erreichen.

Danke für Ihre Hilfe!

+0

So letztlich Sie einfach versuchen, den 'a' Wert zu erhalten, der die einzigartigen Werte in 'b' hat? – mtoto

+0

ich bin mir nicht sicher, dass ich Ihre Phrasierung verstehe. Ich versuche den Wert in 'a' zu finden, dessen Liste von' b' Werten am ehesten mit der Liste eines anderen Wertes in 'a' übereinstimmt. – yarbaur

+0

könntest du nicht einfach 'table (DT)' machen und von dort aus weitermachen? – mtoto

Antwort

0

Dies ist nur Ihre algo, neu geschrieben:

DT[, DT[.SD, on = 'b'][a != currval, .N, by = a][order(-N), .(bestmatch = a[1])] 
    , by = .(currval = a)] 
# currval bestmatch 
#1:  11  13 
#2:  12  11 
#3:  13  11 
Verwandte Themen