Come faccio a dati sub campione di gruppo utilizzando ddply?
Domanda
Ho un frame di dati con troppe righe per essere in grado di fare un correlogramma spaziale. Invece, voglio afferrare 40 righe per ogni specie ed eseguire il mio correlogramma su quel sottoinsieme.
Ho scritto una funzione per sottoinsieme A frame di dati nel seguente modo:
samp <- function(dataf)
{
dataf[sample(1:dim(dataf)[1], size=40, replace=FALSE),]
}
Ora voglio applicare questa funzione per ogni specie in un frame di dati più grande.
Quando cerco qualcosa come
culled_data = ddply (larger_data, .(species), subset, samp)
ottengo questo errore:
Error in subset.data.frame(piece, ...) :
'subset' must evaluate to logical
Qualcuno ha idee su come fare questo?
Soluzione
Si presenta come dovrebbe funzionare una volta che si rimuove , subset
dalla vostra chiamata.
Altri suggerimenti
Dirk risposta è ovviamente corretta, ma per aggiungere ulteriore spiegazione ho posto la mia.
Perché la tua chiamata non fare il lavoro?
Prima di tutto la tua sintassi è una scorciatoia. E 'l'equivalente di
ddply(larger_data, .(species), function(dfrm) subset(dfrm, samp))
in modo da poter vedere chiaramente che fornite function
(vedi class(samp)
) come secondo argomento della subset
. Si potrebbe utilizzare samp(dfrm)
, ma non funzionerà troppo causa samp
ritorno data.frame
e subset
necessità vettore logico. Così si potrebbe usare samp(dfrm)
quando ritorna l'indicizzazione logica.
Come utilizzare sottoinsieme in questo caso?
lavoro rendono subset
per nutrirlo con il vettore logico:
ddply (larger_data, .(species), subset, sample(seq_along(species)<=40))
creo vettore logica con 40 TRUE
(btw funziona quando per alcuni spieces è meno di 40 casi, poi tornare tutti) e casuali esso.