dplyr使用数据帧的功能进行汇总

时间:2015-03-28 15:38:51

标签: r group-by dplyr

使用 dplyr 包执行例程时遇到一些问题。简而言之,我有一个函数,它将数据帧作为输入,并返回一个(数字)值;我希望能够将此函数应用于数据帧的多个子集。感觉我应该能够使用group_by()指定数据帧的子集,然后传递给summarize()函数,但我不确定如何将(子集化的)数据帧传递给函数I'我想申请。

作为一个简化的例子,假设我使用 iris 数据集,我有一个相当简单的函数,我想将其应用于数据的几个子集:

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

现在,我希望能够根据其他变量将此函数应用于 iris 的子集,例如 Species 。我能够手动过滤数据,然后传递给我的函数,例如:

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

但我希望能够根据Species将 lm.func 应用于数据的每个子集。我的第一个想法是尝试以下内容:

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

即使我知道这不起作用,我的想法是尝试将每个虹膜子集传递给lm.func函数。

为了澄清,我想最终得到一个包含两列的数据框 - 第一列包含每个级别的分组变量,第二列的输出为 lm.func 数据仅限于分组变量指定的子集。

是否可以这样使用summarize()?

2 个答案:

答案 0 :(得分:11)

您可以尝试使用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

答案 1 :(得分:3)

如果不创建功能,有一种简单的方法。

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