2013-05-16 8 views
6

W argumencie w data.table znajduje się tam składnia, która pozwala mi odwoływać się do wcześniej utworzonych zmiennych, podczas gdy w tej samej instrukcji j? Zastanawiam się nad czymś takim jak konstrukcja Lisp'a let*.Czy mogę używać zmiennych nowo utworzonych w `j` w tym samym argumencie" j "?

library(data.table) 
set.seed(22) 
DT <- data.table(a = rep(1:5, each = 10), 
       b = sample(c(0,1), 50, rep = TRUE)) 

DT[ , 
    list(attempts = .N, 
     successes = sum(b), 
     rate = successes/attempts), 
    by = a] 

Wynika to w

# Error in `[.data.table`(DT, , list(attempts = .N, successes = sum(b), : 
# object 'successes' not found 

rozumiem dlaczego, ale tam jest inna droga do osiągnięcia tego celu w tym samym j?

+1

możliwe duplikat [nowo dodanego kolumnie 'J' o data.table powinno być możliwe w ramach] (http://stackoverflow.com/questions/16510915/newly-added-column-in-j-of-data-table-should-be-available-in-scope-) –

+1

@RicardoSaporta - Sam to duplikat tego: [ Jak mogę ocenić (lub utworzyć) kolumnę "w locie" w data.table w r] (http://stackoverflow.com/que stions/15712858/how-can-i-evaluation-or-create-an-on-the-fly-column-in-data-in-r/15713753 # comment22337886_15713753);) Wydaje się być wspólnym życzeniem wśród danych .table dla użytkowników. –

+0

@ JoshO'Brien, świetnie! Może możemy połączyć je wszystkie? Dobra obserwacja. Być może powinniśmy umieścić coś w FAQ na temat DT na temat tego –

Odpowiedz

7

Ten rade:

DT[ , { 
    list(attempts = attempts <- .N, 
     successes = successes <- sum(b), 
     rate = successes/attempts) 
    }, by = a] 
# a attempts successes rate 
# 1: 1  10   5 0.5 
# 2: 2  10   6 0.6 
# 3: 3  10   3 0.3 
# 4: 4  10   5 0.5 
# 5: 5  10   5 0.5 

FWIW, this closely related data.table feature request stałaby możliwe +/- składnię używaną w swoim pytaniu. Cytuje połączonej stronie:

Podsumowanie:

iteracyjna RHS z := (i `:=`(...)) i stwardnienie := wewnątrz j = {...} składni

Szczegółowy opis

np DT[, `:=`(m1 = mean(a), m2 = sd(a), s = m1/m2), by = group]

gdzie s może używać poprzednich nazw lhs (używając słowa "iteracyjny" próbuje to przekazać).

+0

+1 za wyciągnięcie FR –

4

Spróbuj zamiast:

DT[, 
    {successes = sum(b); 
    attempts = .N; 
    list(attempts = attempts, 
     successes = successes, 
     rate = successes/attempts) 
    }, 
    by = a] 

lub

DT[, 
    list(attempts = .N, 
     successes = sum(b)), 
    by = a][, rate := successes/attempts]