2012-12-01 3 views
6

ich ein data.table X habe, dass ich eine VariableWie in Vektorsuche vermeiden data.table

X[, varC :=((VarA =="A" & !is.na(VarA)) 
       | (VarA == "AB" & VarB =="B" & !is.na(VarA) & !is.na(VarB)) 
       ) 
     ] 

Dieser Code funktioniert basierend auf 2 Zeichenvariablen erstellen möchte, aber es ist sehr langsam, weil es Scannt Vektor auf 2 Char-Variablen. Beachten Sie, dass ich die Tabelle key Claims4 nicht mit VarA und VarB einstelle. Gibt es einen "richtigen" Weg, dies in data.table zu tun?

Update 1: Ich benutze nicht setkey für diese Transformation, weil ich bereits setkey (X, Year, ID) für andere Variablentransformationen verwenden. Wenn ich das tue, muss ich die Schlüssel nach dieser Umwandlung auf Year, ID zurücksetzen.

Update 2: Ich habe mit Matthew Ansatz meines Ansatz Benchmark, und seine viel schneller:

  test replications elapsed relative user.self sys.self user.child sys.child 
2 Matthew    100 3.377 1.000  2.596 0.605   0   0 
1 vectorSearch   100 200.437 59.354 76.628 40.260   0   0 

Die einzige kleine Sache ist setkey dann wieder neu setkey ist etwas weitschweifig :)

+1

Warum setzen Sie keinen Schlüssel? –

+0

Dort könnte auch etwas unnötige Codierung sein; Wenn z. B. VarA == "AB" WAHR ist, dann ist es auch immer WAHR, dass! is.na (VarA), richtig? –

+0

Hallo Marc, die! Is.na ist Pflicht. Ansonsten, wenn VarA fehlt, dann wird die Bedingung VarA == "AB" NA anstatt 0 zurückgeben, wie ich möchte – AdamNYC

Antwort

6

Wie about:

setkey(X,VarA,VarB) 
X[,varC:=FALSE] 
X["A",varC:=TRUE] 
X[J("A","AB"),varC:=TRUE] 

oder, in einer Linie (Wiederholungen der variable X zu speichern und demonstrieren):

X[,varC:=FALSE]["A",varC:=TRUE][J("A","AB"),varC:=TRUE] 

Um zu vermeiden, den Schlüssel einstellen, wie gewünscht, wie etwa ein manueller Sekundärschlüssel:

S = setkey(X[,list(VarA,VarB,i=seq_len(.N))],VarA,VarB) 
X[,varC:=FALSE] 
X[S["A",i][[2]],varC:=TRUE] 
X[S[J("A","AB"),i][[3]],varC:=TRUE] 

nun klar, dass Syntax ist hässlich. Also FR#1007 Build in secondary keys ist das in die Syntax zu bauen; z. B.

set2key(X,varA,varB) 
X[...some way to specify which key to join to..., varC:=TRUE] 

In der Zwischenzeit ist es möglich, nur manuell, wie oben gezeigt.

+0

Hallo Matthew, bitte beachten Sie mein Update für den Grund nicht zu vermeiden, hier setzen. Aber möglicherweise setkey dann Reset-Taste immer noch schneller sein als Vektor-Suche :) – AdamNYC

+0

Ok ich sehe, dann ist eine weitere Option sekundäre Tasten. Wird bearbeiten ... –

+0

Vielen Dank, Mat. Ich lerne heute viele neue Dinge. set2key wäre schön. Im Moment scheint es mir, dass das Setzen und Zurücksetzen von Schlüsseln, obwohl dem Code zwei weitere Zeilen hinzugefügt werden, einfacher zu lesen ist. Es wurde kein weiterer (kleiner) Datensatz erstellt (d. H. S in Ihrem Beispiel). – AdamNYC