2012-07-06 13 views
21

Ho cercato di capire cosa e come funziona plyr attraverso il provare diverse variabili e funzioni e vedere quali risultati. Quindi sono più alla ricerca di una spiegazione di come funziona plyr rispetto a quello specifico che risolve. Ho letto la documentazione ma il mio cervello da principiante non lo sta ancora ottenendo.Imparare a comprendere plyr, ddply

Alcuni dati e nomi:

mydf<- data.frame(c("a","a","b","b","c","c"),c("e","e","e","e","e","e") 
        ,c(1,2,3,10,20,30), 
        c(5,10,20,20,15,10)) 
colnames(mydf)<-c("Model", "Class","Length", "Speed") 
mydf 

Domanda 1: Riassumere contro Transform Sintassi

Quindi se entro: ddply(mydf, .(Model), summarise, sum = Length+Length)

ottengo:

`Model ..1 
1  a 2 
2  a 4 
3  b 6 
4  b 20 
5  c 40 
6  c 60 

e se io inserire: ddply(mydf, .(Model), summarise, Length+Length) Ottengo lo stesso risultato.

Ora, se l'uso di trasformare: ddply(mydf, .(Model), transform, sum = (Length+Length))

ottengo:

Model Class Length Speed sum 
1  a  e  1  5 2 
2  a  e  2 10 4 
3  b  e  3 20 6 
4  b  e  10 20 20 
5  c  e  20 15 40 
6  c  e  30 10 60 

Ma se affermo che come la prima sintesi: ddply(mydf, .(Model), transform, (Length+Length))

Model Class Length Speed 
1  a  e  1  5 
2  a  e  2 10 
3  b  e  3 20 
4  b  e  10 20 
5  c  e  20 15 
6  c  e  30 10 

Allora perché l'aggiunta di "somma = " fare la differenza?

Domanda 2: Perché questi non funzionano?

ddply(mydf, .(Model), sum, Length+Length) #Error in funzione (i): oggetto 'Lunghezza' non trovato

ddply(mydf, .(Model), length, mydf$Length) #Error in .fun(piece, ...) : 

2 argomenti passati a 'lunghezza', che richiede 1

Questi esempi sono più da dimostrare che da qualche parte I' fondamentalmente non capisco come usare plyr.

Eventuali anomalie o spiegazioni sono apprezzate.

risposta

18

La sintassi è:

ddply(data.frame, variable(s), function, optional arguments) 

in cui è prevista la funzione per restituire un data.frame. Nella tua situazione,

  • riassumere è una funzione che in modo trasparente creare un nuovo data.frame, con i risultati dell'espressione che forniti come ulteriori argomenti (...)

  • trasformare, un funzione di base R, trasformerà i dati.frames (prima divisa dalla variabile (s)), aggiungendo nuove colonne in base all'espressione (s) che si forniscono come ulteriori argomenti. Questi devono essere nominati, questo è solo il modo in cui la trasformazione funziona.

Se si utilizzano altre funzioni di sottoinsieme, trasformare, mutare, con, all'interno, o riassumere, è necessario assicurarsi che essi restituiscono un data.frame (lunghezza e somma non lo fanno), o il minimo un vettore di lunghezza appropriata per l'output.

+1

Inoltre, credo che il primo insieme di esempi nell'OP sia semplicemente la differenza nel comportamento predefinito tra "riepiloga" e "trasformazione" se si trascura di includere un tag come "val =" nell'espressione. 'sumarise' apparentemente fornirà il proprio nome, mentre' transform' sembra ignorarlo. – joran

4

Il modo in cui sono comprensibile le operazioni ddply(... , .(...) , summarise, ...) sono progettate per ridurre il numero di righe in modo che corrisponda al numero di combinazioni distinte all'interno delle variabili di raggruppamento .(...). Quindi per il tuo primo esempio, questo sembrava naturale:

ddply(mydf, .(Model), summarise, sL = sum(Length) 
    Model sL 
1  a 3 
2  b 13 
3  c 50 

OK. Sembra funzionare per me (non un utente regolare di plyr). D'altro canto, le operazioni transform mi sembrano fare nuove colonne della stessa lunghezza del dataframe. Questo è stato il risultato della tua prima chiamata transform. Il vostro secondo (un fallimento) era:

ddply(mydf, .(Model), transform, (Length+Length)) 

Che uno non ha creato un nuovo nome per l'operazione che è stata eseguita, quindi non c'era niente di nuovo assegnato nel risultato. Quando hai aggiunto sum=(Length+Length), improvvisamente era disponibile un nome (e la funzione sum era non utilizzata). In genere è una cattiva idea utilizzare i nomi delle funzioni per i nomi delle colonne.

Nella domanda due, penso che l'argomento .fun debba essere una funzione plyr o qualcosa che abbia senso applicato a un dataframe (suddiviso) nel suo complesso piuttosto che a una funzione vecchia. Non esiste la funzione sum.data.frame. Ma "nrow" o "ncol" hanno senso. Puoi persino far funzionare 'str' in quella posizione. La funzione di lunghezza applicato ad un dataframe dà il numero di colonne:

ddply(mydf, .(Model), length) # all 4's 
21

Trovo che quando sto avendo problemi "visualizzare" come uno qualsiasi degli strumenti funzionali in attività di ricerca, che la cosa più semplice da fare è il browser una singola istanza:

ddply(mydf, .(Model), function(x) browser()) 

quindi ispezionare x in tempo reale e dovrebbe tutto un senso. Puoi quindi testare la tua funzione su x, e se funziona sarai d'oro (salvo che altri gruppi siano diversi dalla tua prima x).