使用dplyr访问分组数据

11

如何在使用dplyr的group_by函数并使用%.% 运算符后访问分组数据?

例如,如果我想要每个分组数据的第一行,则可以使用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  

我不是很清楚你所说的“访问组数据”的意思。你能详细说明一下吗? - Roman Luštrik
我想使用dplyr包中的group_by函数并使用%.%后访问每个组。 - Chitrasen
你可以添加 summarise(myfun = myfun(column)) 来处理自定义函数 myfun 在 chunk 上的工作。如果你打开 browser,你将能够看到正在处理的值。 - Roman Luštrik
2个回答

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

对于任意操作,在0.2版本中do()非常有用。您可以使用.作为每个组的占位符来提供任意表达式:

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

1
我找到的唯一可能有用的方法是使用do函数。
library(dplyr)

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

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

如果与%.%运算符一起使用,这将返回一个列表。 - Chitrasen

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接