2015-03-28 29 views
6

dplyr paketini kullanarak bir rutin yürütme konusunda sorun yaşıyorum. Kısacası, veri çerçevesini girdi olarak alan ve tek (sayısal) bir değer döndüren bir işlevim var; Bu işlevi bir veri çerçevesinin birkaç alt kümesine uygulayabilmek istiyorum. Dataframe alt kümelerini belirtmek için group_by() yöntemini kullanabiliyormuşum gibi hissettiriyor, sonra summarize() işlevine kadar boruya atıyorum, ancak (alt) veri çerçevesini I 'işlevine nasıl geçireceğimi bilmiyorum uygulamaktan hoşlanırım.dplyr, bir veri çerçevesinin bir işleviyle özetler

basitleştirilmiş bir örnek olarak

, ı iris veri kümesini kullanıyorum diyelim, ben birkaç veri alt kümeleri için uygulamak istediğiniz oldukça basit bir işlevi var:

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

Şimdi, bu işlevi iris alt kümelerine Türler gibi başka bir değişkeni temel alarak uygulamak istiyorum. El ile örneğin, benim işlevine birlikte daha sonra, boru verilere filtre açabiliyorum:

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

Ama verilerinher alt küme lm.func uygulayabilecektir istiyorum türüne göre. benim fikrim lm.func işlevine iris her alt kümesini geçmek denemektir,

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

bildiğim halde bu işe yaramazsa: İlk düşüncem aşağıdaki gibi çalışmaktır. Veri sınırlı olduğunda gruplama değişkenin her bir seviye ile, bir birinci ve lm.func çıkışı ile ikinci bir -

iki sütunlu bir dataframe ile bitirmek için de açıklığa kavuşturmak gruplama değişkeni tarafından belirtilen bir alt kümesi.

Bu şekilde summarize() kullanmak mümkün mü?

+0

Bu çözüldü - teşekkürler akrun! –

cevap

10

Sen bir işlev oluşturmadan yapmanın kolay bir yolu yoktur 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

ile deneyebilirsiniz.

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 
İlgili konular