2011-04-19 16 views
5

Mi piace scrivere una funzione utilizzando ddply che restituisce le statistiche di riepilogo basate sul nome di due colonne di data.framemat.Statistiche riassuntive con ddply

  • mat è un grande data.frame con il nome di colonne "metric", "length", "species", "tree", ...,"index"

  • index è fattore di 2 livelli "Short", "Long"

  • "metric", "length", "species", "tree" e gli altri sono tutti variabili continue

Funzione :

summary1 <- function(arg1,arg2) { 
    ... 

    ss <- ddply(mat, .(index), function(X) data.frame(
     arg1 = as.list(summary(X$arg1)), 
     arg2 = as.list(summary(X$arg2)), 
     .parallel = FALSE) 

    ss 
} 

mi aspetto l'uscita a guardare come questo dopo aver chiamato summary1("metric","length")

Short metric.Min. metric.1st.Qu. metric.Median metric.Mean metric.3rd.Qu. metric.Max. length.Min. length.1st.Qu. length 
.Median length.Mean length.3rd.Qu. length.Max. 

.... 

Long metric.Min. metric.1st.Qu. metric.Median metric.Mean metric.3rd.Qu. metric.Max. length.Min. length.1st.Qu. length 
.Median length.Mean length.3rd.Qu. length.Max. 

.... 

Al momento la funzione non produce il risultato desiderato? Quale modifica dovrebbe essere fatta qui?

Grazie per il vostro aiuto.


Ecco un esempio giocattolo

mat <- data.frame(
    metric = rpois(10,10), length = rpois(10,10), species = rpois(10,10), 
    tree = rpois(10,10), index = c(rep("Short",5),rep("Long",5)) 
) 
+0

Questo sarebbe più facile rispondere se hai fornito i dati di esempio (prefereably con ' dput'). –

+0

@ Richie- Ecco un esempio di giocattolo 'mat <-data.frame (metrico = rpois (10,10), lunghezza = rpois (10,10), specie = rpois (10,10), albero = rpois (10, 10), index = c (rep ("Short", 5), rep ("Long", 5))) - Grazie – Tony

+1

È possibile modificare la domanda per aggiungere dati di esempio anziché scrivere un commento (l'ho fatto per te;)). – Marek

risposta

4

Come Nick wrote in his answer non è possibile utilizzare per fare riferimento $ variabile passata come nome del personaggio. Quando hai scritto X$arg1 quindi R cerca la colonna denominata "arg1" in data.frameX. È possibile fare riferimento ad esso tramite X[,arg1] o X[[arg1]].

e se si vuole ben nominato uscita propongo qui di seguito la soluzione:

summary1 <- function(arg1, arg2) { 

    ss <- ddply(mat, .(index), function(X) data.frame(
     setNames(
      list(as.list(summary(X[[arg1]])), as.list(summary(X[[arg2]]))), 
      c(arg1,arg2) 
      )), .parallel = FALSE) 

    ss 
} 
summary1("metric","length") 

uscita per i dati giocattolo è:

index metric.Min. metric.1st.Qu. metric.Median metric.Mean metric.3rd.Qu. 
1 Long   5    7   10   8.6    10 
2 Short   7    7    9   8.8    10 
    metric.Max. length.Min. length.1st.Qu. length.Median length.Mean length.3rd.Qu. 
1   11   9    10   11  10.8    12 
2   11   4    9    9   9.0    11 
    length.Max. 
1   12 
2   12 
1

È questo più simile a ciò che si vuole?

summary1 <- function(arg1,arg2) { 
ss <- ddply(mat, .(index), function(X){ data.frame(
    arg1 = as.list(summary(X[,arg1])), 
    arg2 = as.list(summary(X[,arg2])), 
    .parallel = FALSE)}) 
ss 
}