[UPDATE] 2 anni dopo la questione è stato chiesto ...
Sulla esecuzione del codice nella questione, data.table
è ora più utile e restituisce questo (utilizzando 1.8.2):
Error in `[.data.table`(my.dt, , sum(dependent.variable), by = grouping.vars[i]) :
'by' appears to evaluate to column names but isn't c() or key(). Use by=list(...)
if you can. Otherwise, by=eval(grouping.vars[i]) should work. This is for efficiency
so data.table can detect which columns are needed.
e seguendo i consigli nella seconda frase di errore:
my.dt[,sum(dependent.variable), by=eval(grouping.vars[i])]
sex V1
1: M 2650
2: F 2600
Vecchio risposta da Lug 2010 (by
può ora essere double
e character
, però):
A rigor di termini le by
necessità di valutare a un elenco di vettori ciascuno con modalità di archiviazione intero, però. Pertanto, il vettore numerico age
potrebbe essere convertito in intero utilizzando as.integer()
. Questo perché data.table utilizza l'ordinamento digitale (molto veloce) ma l'algoritmo radix è specifico per gli interi solo (vedere la voce di wikipedia per 'ordinare radix'). La memorizzazione di interi per colonne chiave e ad hoc by
è uno dei motivi per cui data.table è veloce. Un fattore è ovviamente una ricerca di interi per stringhe univoche.
L'idea dietro by
è una list()
di espressioni è che non si è limitato ai nomi di colonna. È normale scrivere espressioni di nomi di colonne direttamente nello by
. Un comune è quello di aggregare per mese; ad esempio:
DT[,sum(col1), by=list(region,month(datecol))]
o un modo molto veloce per il raggruppamento annoMese è quello di utilizzare un data base non epoca, come yyyymmddL come visto in alcuni degli esempi nel pacchetto, in questo modo:
DT[,sum(col1), by=list(region,month=datecol%/%100L)]
Nota come puoi nominare le colonne all'interno della lista() in questo modo.
di definire e riutilizzare complesse espressioni di raggruppamento:
e = quote(list(region,month(datecol)))
DT[,sum(col1),by=eval(e)]
DT[,sum(col2*col3/col4),by=eval(e)]
O se non si vuole rivalutare le by
espressioni di volta in volta, è possibile salvare il risultato una volta e riutilizzare il risultato per l'efficienza; se le espressioni by
stessi impiegano molto tempo per calcolare/allocare, o avete bisogno di riutilizzare molte volte:
byval = DT[,list(region,month(datecol))]
DT[,sum(col1),by=byval]
DT[,sum(col2*col3/col4),by=byval]
Si prega di consultare http://datatable.r-forge.r-project.org/ per le informazioni più recenti e lo stato. Presto ci sarà una nuova presentazione e speriamo di rilasciare presto anche la versione 1.5 di CRAN. Questo contiene diverse correzioni di bug e nuove funzionalità dettagliate nel file NEWS. La lista di aiuto datatable ha circa 30-40 post al mese che potrebbero essere di interesse.
si hanno due "grouping.vars", ma sono l'iterazione tra 1: 5. Mi manca qualcosa lì? – Shane
Inoltre, nel tuo esempio di lavoro, il sesso è un oggetto, mentre nella versione in mancanza è un personaggio. – Shane
Ehi Shane, mi dispiace, l'ho risolto. Dovrebbe essere 2 non 5. Questo è ciò che non mi è chiaro, sembra che il sesso sia un oggetto (??). –