2015-03-28 13 views
6

Ho qualche problema a eseguire una routine utilizzando il pacchetto dplyr. In breve, ho una funzione che prende un dataframe come input e restituisce un singolo valore (numerico); Mi piacerebbe essere in grado di applicare questa funzione a diversi sottoinsiemi di un dataframe. Sembra che dovrei essere in grado di usare group_by() per specificare i sottoinsiemi del dataframe, quindi passare alla funzione riepilogare(), ma non sono sicuro di come passare il (data-settima) dataframe insieme alla funzione I ' mi piace applicare.dplyr riepilogare con una funzione di un dataframe

Come un esempio semplificato, diciamo che sto utilizzando le iride set di dati, e ho una funzione abbastanza semplice, che mi piacerebbe applicare a diversi sottoinsiemi di dati:

data(iris) 
lm.func = function(.data){ 
    lm.fit = lm(Petal.Width ~ Petal.Length, data = .data) 
    out = summary(lm.fit)$coefficients[2,1] 
    return(out) 
} 

Ora, vorrei essere in grado di applicare questa funzione ai sottoinsiemi iris in base ad altre variabili, come Specie. Sono in grado di filtrare manualmente i dati, quindi il tubo lungo alla mia funzione, ad esempio:

iris %>% filter(Species == "setosa") %>% lm.func(.) 

Ma mi piacerebbe essere in grado di applicare lm.func-ogni sottoinsieme dei dati , basato sulla specie. Il mio primo pensiero è stato quello di provare qualcosa di simile al seguente:

iris %>% group_by(Species) %>% summarize(coef.val = lm.func(.)) 

Anche se so che questo non funziona, la mia idea è quella di cercare di superare ogni sottoinsieme di iris alla funzione lm.func.

Per chiarire, vorrei finire con un dataframe con due colonne - una prima ad ogni livello della variabile di raggruppamento, ed una seconda con l'uscita di lm.func quando i dati sono limitati a un sottoinsieme specificato dalla variabile di raggruppamento.

È possibile utilizzare il riepilogo() in questo modo?

+0

Questo risolto - grazie akrun! –

risposta

10

Si può provare con do

iris %>% 
     group_by(Species) %>% 
     do(data.frame(coef.val=lm.func(.))) 
#  Species coef.val 
#1  setosa 0.2012451 
#2 versicolor 0.3310536 
#3 virginica 0.1602970 
3

C'è un modo semplice per farlo senza creare una funzione.

library(broom) 
models <-iris %>% 
    group_by(Species) %>% 
    do(
    mod = lm(Petal.Width ~ Petal.Length, data =.) 
) 

    models %>% do(tidy(.$mod)) 

      term estimate std.error statistic  p.value 
1 (Intercept) -0.04822033 0.12164115 -0.3964146 6.935561e-01 
2 Petal.Length 0.20124509 0.08263253 2.4354220 1.863892e-02 
3 (Intercept) -0.08428835 0.16070140 -0.5245029 6.023428e-01 
4 Petal.Length 0.33105360 0.03750041 8.8279995 1.271916e-11 
5 (Intercept) 1.13603130 0.37936622 2.9945505 4.336312e-03 
6 Petal.Length 0.16029696 0.06800119 2.3572668 2.253577e-02 
Problemi correlati