2015-03-28 20 views
6

Mam problem z wykonaniem procedury przy użyciu pakietu dplyr. W skrócie, mam funkcję, która pobiera ramkę danych jako dane wejściowe i zwraca pojedynczą (liczbową) wartość; Chciałbym móc zastosować tę funkcję do kilku podzbiorów ramek danych. Wydaje mi się, że powinienem móc użyć funkcji group_by() w celu określenia podzbiorów frameworka, a następnie potoku do funkcji summary(), ale nie jestem pewien, jak przekazać (podzieloną) ramkę danych wzdłuż funkcji I ' Chciałbym się zgłosić.dplyr podsumowuje za pomocą funkcji ramki danych

W uproszczonym przykładzie, powiedzmy, że używam tęczówki zbiór danych, i mam dość prostą funkcję, które chciałbym, aby zastosować się do kilku podgrupach danych:

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

Teraz chciałbym móc zastosować tę funkcję do podzbiorów tęczówki na podstawie innej zmiennej, takiej jak Gatunek. Jestem w stanie ręcznie filtrować dane, a następnie wzdłuż rury do mojej funkcji, na przykład:

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

Ale chciałbym, aby móc zastosować lm.func do każdego podzbioru danych , na podstawie gatunków. Moją pierwszą myślą było spróbować czegoś tak:

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

Choć wiem, że to nie działa, mój pomysł jest, aby spróbować przejść każdy podzbiór tęczówki do funkcji lm.func.

Aby to wyjaśnić, chciałbym otrzymać ramkę danych z dwiema kolumnami - pierwszą z każdym poziomem zmiennej grupującej i drugą z wynikiem lm.func, gdy dane są ograniczone do podzbiór określony przez zmienną grupującą.

Czy można użyć podsumowania() w ten sposób?

+0

To rozwiązało - dzięki akrun! –

Odpowiedz

10

Można spróbować z 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

Jest łatwym sposobem zrobić bez tworzenia funkcji.

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