2012-12-01 7 views
6

ho un X data.table che vorrei creare una variabile sulla base di 2 variabili carattereCome evitare di ricerca vettore in data.table

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

questo codice funziona, ma è molto lento, perché esegue la scansione vettoriale su 2 variabili char. Si noti che non setkey claims4 tabella di VarA e VarB. Esiste un modo "giusto" per farlo in data.table?

Update 1: Non utilizzo setkey per questa trasformazione perché utilizzo già setkey (X, Year, ID) per altre trasformazioni di variabili. Se lo faccio, ho bisogno di ripristinare le chiavi in ​​Anno, ID dopo questa trasformazione.

Update 2: ho fatto riferimento il mio approccio con l'approccio di Matteo, e il suo è molto più veloce:

  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 

L'unica cosa minore è setkey poi ri-setkey è di nuovo un po 'prolissa :)

+1

Perché non si imposta la chiave? –

+0

Potrebbe anche esserci qualche codifica non necessaria; per esempio se VarA == "AB" è TRUE, allora sarà sempre anche VERO che! is.na (VarA), giusto? –

+0

Ciao Marc, il! Is.na è richiesto. Altrimenti, se Manca VarA, allora condizione VarA == "AB" restituirà NA invece di 0 come vorrei – AdamNYC

risposta

6

Come a proposito di:

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

o, in una linea (per salvare le ripetizioni della variabile X e dimostrare):

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

per evitare di impostare la chiave, come richiesto, come su un secondario manuale chiave:

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] 

Ora chiaramente, che la sintassi è brutto. Quindi, FR#1007 Build in secondary keys è quello di costruirlo nella sintassi; ad es.,

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

Nel frattempo è possibile, solo manualmente, come mostrato sopra.

+0

Ciao Matteo, si prega di vedere il mio aggiornamento per la ragione di non evitare setkey qui. Ma potrebbe essere setkey, quindi il tasto di reset sarà ancora più veloce della ricerca vettoriale :) – AdamNYC

+0

Ok, capisco, quindi un'altra opzione sono le chiavi secondarie. Modificherà ... –

+0

Grazie mille, Mat. Imparo molte cose nuove oggi. set2key sarebbe adorabile. Per ora, mi sembra che impostare e reimpostare i tasti, sebbene aggiunga altre due righe al codice, sia più facile da leggere. Non ha creato un altro (piccolo) set di dati (ad esempio, S nel tuo esempio). – AdamNYC

Problemi correlati