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?

È stato utile?

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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top