2011-10-28 11 views
5

Ho questa funzione:costringere un'uscita multipla in una nuova dataframe utilizzando ddply

> λ.est <- function(x){ 
      mle.optim <- mle2(paretoNLL,start=list(λ=-0.7),data=list(x=x),trace=TRUE) 
      return(summary(mle.optim)@coef[1,1:4]) 
      } 

che corrispondono a una distribuzione e Retuns la stima dei parametri, std. errore, valore zop per il mio modello. devo applicare questa funzione per diversi sottoinsiemi di dati originali il mio telaio size definito da una combinazione di fattori pond,habitat,treatment,date, e per fare questo sto usando la funzione ddply:

> mle.λ <- ddply(size, .(pond,habitat,treatment,date), 
    summarise, λ=λ.est(x=mass.wei)) 

il problema è che, facendo questo, posso solo aggiungere una colonna un tempo per il nuovo telaio di dati mle.λ, che a norma ho bisogno di aggiungere a mle.λ quattro nuove colonne, una per ciascuna delle uscite di λ.est fondamentalmente qualcosa che assomigliano a questo:

> mle.λ 
     pond habitat treatment date estimate std. error z value Pr(z) 
     - -  -  -  -  -   -  - 
     - -  -  -  -  -   -  - 
     - -  -  -  -  -   -  - 
     - -  -  -  -  -   -  - 
     - -  -  -  -  -   -  - 
     ... 

Finora io Ho scritto una funzione diversa per ogni output necessario, ma mi piacerebbe fare un po 'di economia del codice ... c'è un modo per fare tutto in una volta?

grazie matteo

risposta

5

Dal momento che si dispone già di una funzione di sintesi, non è necessario usare anche la funzione summarise. Inoltre, è è possibile restituire più di una uscita in una volta. Dal momento che non ci sono dati di esempio, qui è uno che dovrebbe dimostrare chiaramente come fare questo:

n = 20 
set.seed(12345) 
data = data.frame(cbind(pond=1:2, habitat=1:3, value = rnorm(n))) 
> ddply(data, .(habitat, pond), function(x) summary(x$value)) 
    habitat pond Min. 1st Qu. Median Mean 3rd Qu. Max. 
1  1 1 0.3706 0.5318 0.6078 0.6767 0.7528 1.1210 
2  1 2 -0.9193 -0.6864 -0.4535 -0.1853 0.1817 0.8169 
3  2 1 -0.8864 -0.5013 -0.1162 -0.1322 0.2448 0.6059 
4  2 2 -0.2762 0.1550 0.4095 0.3131 0.5675 0.7095 
5  3 1 -0.7505 -0.5173 -0.2842 -0.3813 -0.1967 -0.1093 
6  3 2 -1.8180 -1.0750 -0.3316 -0.1107 0.7429 1.8170 
+0

davvero appriciated John, come sempre molto più semplice di quanto ho pensato ... devo ancora marciare molto sulla R route .. – matteo

+0

Grande! Sono contento che abbia aiutato. –

Problemi correlati