2014-03-28 44 views
9

分組數據如何訪問分組數據從dplyr應用GROUP_BY功能和使用%%運營商訪問在dplyr

例如後,如果我想有每個分組數據的第一行,然後我可以做這種使用plyr包作爲

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 
+0

你所說的「accesing組數據」意味着它是不完全清楚給我。你能詳細說一下嗎? –

+0

我想在使用dplyr軟件包中的group_by函數並使用%之後訪問每個組。%db% – Chitrasen

+0

您可以添加一個'summarize(myfun = myfun(column))'來處理myfun是自定義函數的塊大塊。如果您打開「瀏覽器」,您將能夠看到正在處理的值。 –

回答

13

針對您的特殊情況下,你可以使用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 

這將是0.2版本多了幾分自然的,因爲你可以省略 變量名:

# 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 

對於任意操作,do()在0.2中更有用。你給它 任意表達式,使用.作爲各組的佔位符:

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 
0

唯一的辦法我發現可以使用do功能幫助。

library(dplyr) 

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

do(g.iris, function(x){ head(x, n=1)}) 
+0

如果與%。%運算符一起使用,將返回一個列表 – Chitrasen