2014-06-10 3 views
33

Sto tentando di sostituire tutte le mie chiamate plyr con dplyr. Ci sono ancora alcuni problemi e uno di questi è con la funzione group_by. Immagino che si comporta allo stesso modo del secondo argomento ddply e fa una divisione, applica e combina in base alle variabili di raggruppamento I. Ma non sembra essere il caso. Ecco un esempio piuttosto banale.Come replicare un comportamento di ddply che utilizza una funzione personalizzata con dplyr?

Definiamo una funzione stupida

mm <- function(x) return(x[1:5, ]) 

Ora possiamo dividere le specie nel iris set di dati in questo modo e applicare questa funzione per ogni pezzo.

ddply(iris, .(Species), mm) 

Questo funziona come previsto. Tuttavia, quando provo lo stesso con dplyr, non funziona come previsto.

iris %>% group_by(Species) %>% mm 

Cosa sto facendo male?

risposta

34

Come mostrato in ?do, è possibile fare riferimento a un gruppo con . nell'espressione. Di seguito replicherà il tuo ddply uscita:

iris %>% group_by(Species) %>% do(.[1:5, ]) 

# Source: local data frame [15 x 5] 
# Groups: Species 
# 
# Sepal.Length Sepal.Width Petal.Length Petal.Width Species 
# 1   5.1   3.5   1.4   0.2  setosa 
# 2   4.9   3.0   1.4   0.2  setosa 
# 3   4.7   3.2   1.3   0.2  setosa 
# 4   4.6   3.1   1.5   0.2  setosa 
# 5   5.0   3.6   1.4   0.2  setosa 
# 6   7.0   3.2   4.7   1.4 versicolor 
# 7   6.4   3.2   4.5   1.5 versicolor 
# 8   6.9   3.1   4.9   1.5 versicolor 
# 9   5.5   2.3   4.0   1.3 versicolor 
# 10   6.5   2.8   4.6   1.5 versicolor 
# 11   6.3   3.3   6.0   2.5 virginica 
# 12   5.8   2.7   5.1   1.9 virginica 
# 13   7.1   3.0   5.9   2.1 virginica 
# 14   6.3   2.9   5.6   1.8 virginica 
# 15   6.5   3.0   5.8   2.2 virginica 

Più in generale, di applicare una funzione personalizzata per gruppi con dplyr, si può fare qualcosa di simile a quanto segue (@docendodiscimus grazie):

iris %>% group_by(Species) %>% do(mm(.)) 
+6

+1 più , se l'OP vuole usare la sua funzione personalizzata, può anche farlo: 'iris%>% group_by (Specie)%>% do (mm (.))' o usa solo 'iris%>% group_by (Specie)% >% do (testa (., 5)) ' –