Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Accessing grouped data in dplyr

Tags:

r

dplyr

plyr

How can I access the grouped data after applying group_by function from dplyr and using %.% operator

For example, If I want to have the first row of each grouped data then I can do this using plyr package as

ddply(iris,.(Species),function(df){
  df[1,]
})

#output
#  Sepal.Length Sepal.Width Petal.Length Petal.Width    Species
#1          5.1         3.5          1.4         0.2     setosa
#2          7.0         3.2          4.7         1.4 versicolor
#3          6.3         3.3          6.0         2.5  virginica  
like image 291
Chitrasen Avatar asked Mar 28 '14 09:03

Chitrasen


2 Answers

For your specific case, you can use row_number():

library(dplyr)

iris %.% 
  group_by(Species) %.%
  filter(row_number(Species) == 1)
## Source: local data frame [3 x 5]
## Groups: Species
## 
##   Sepal.Length Sepal.Width Petal.Length Petal.Width    Species
## 1          5.1         3.5          1.4         0.2     setosa
## 2          7.0         3.2          4.7         1.4 versicolor
## 3          6.3         3.3          6.0         2.5  virginica

This will be a little more natural in version 0.2 since you can omit the variable name:

# devtools::install_github("hadley/dplyr")

iris %.% 
  group_by(Species) %.%
  filter(row_number() == 1)
## Source: local data frame [3 x 5]
## Groups: Species
## 
##   Sepal.Length Sepal.Width Petal.Length Petal.Width    Species
## 1          5.1         3.5          1.4         0.2     setosa
## 2          7.0         3.2          4.7         1.4 versicolor
## 3          6.3         3.3          6.0         2.5  virginica

For arbitrary operations, do() is much more useful in 0.2. You give it arbitrary expressions, using . as a placeholder for each group:

iris %.% 
  group_by(Species) %.%
  do(.[1, ])
## Source: local data frame [3 x 6]
## Groups: Species
## 
##      Species Sepal.Length Sepal.Width Petal.Length Petal.Width  Species.1
## 1     setosa          5.1         3.5          1.4         0.2     setosa
## 2 versicolor          7.0         3.2          4.7         1.4 versicolor
## 3  virginica          6.3         3.3          6.0         2.5  virginica
like image 98
hadley Avatar answered Nov 15 '22 22:11

hadley


The only way I found that may help is using the do function.

library(dplyr)

g.iris <- group_by(x=iris, Species)

do(g.iris, function(x){ head(x, n=1)})
like image 38
zelite Avatar answered Nov 15 '22 21:11

zelite