2015-01-28 21 views
5

Come posso fare questo senza calcolare le funzioni somma e prod due volte?Utilizzo del risultato della funzione di nuovo in j espressione

require(data.table) 

DT = data.table(x=rep(c("a","b","c"),each=4), y=1:6, V1 = 1000L, V2 = 2000, V3 = 1) 

DT[x != "c",":="(
    V1 = sum(y), 
    V2 = prod(y), 
    V3 = sum(y) + prod(y) 
),by=x] 

Naturalmente posso solo cadere il calcolo V3 e poi continuare così:

DT[x != "c",V3 := V1 + V2] 

Ma non è molto pulito e inoltre i-espressione deve essere valutata nuovamente.

la mia sintassi desiderato è qualcosa di simile:

DT[x != "c",":="(
    V1 = sum(y), 
    V2 = prod(y), 
    V3 = V1 + V2 
),by=x] 
+0

Così dovrebbe contenere l'output desiderato I valori di 'NA' per' x == c', o dovrebbero essere eliminate queste righe? – nrussell

+0

x == c non deve essere toccato. Ho chiarito la questione inserendo alcuni valori iniziali in questo punto – Pekka

+2

Vedrò se posso aggiungere questo alle [vignette semantiche di Introduzione e di riferimento] (https://github.com/Rdatatable/data.table/issues/944). Viene abbastanza frequentemente. – Arun

risposta

9

È possibile utilizzare { .. } per definire la vostra espressione e memorizzare variabile intermedia prima del risultato di tornare:

DT[x != "c", c("V1","V2","V3") := 
    { V1 <- sum(y) 
     V2 <- prod(y)   
     V3 <- V1 + V2  
     list(V1,V2,V3)},by=x] 
+1

Grazie! Esattamente quello che stavo cercando. – Pekka

Problemi correlati