使用dplyr对数据框进行函数汇总

13

我在使用dplyr包执行例行程序时遇到了一些问题。简而言之,我有一个函数,它以数据框作为输入,并返回单个(数值)值; 我想能够将此函数应用于数据框的几个子集。感觉我应该能够使用group_by()来指定数据框的子集,然后通过管道传递到summarize()函数,但我不知道如何将(子集)数据框传递到我想要应用的函数。

以简化的例子为例,假设我正在使用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)
}

现在,我希望能够将此函数应用于基于其他变量(如“Species”)的 iris 子集。例如,我可以手动过滤数据,然后将其传递到我的函数中:

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

但我希望能够基于物种将 lm.func 应用于数据的 每个 子集。 我最初的想法是尝试以下内容:

iris %>% group_by(Species) %>% summarize(coef.val = lm.func(.))
即使我知道这样做行不通,我的想法是尝试将每个鸢尾花子集传递给lm.func函数。为了澄清,我希望得到一个包含两列的数据框——第一列是分组变量的每个水平,第二列是lm.func的输出结果,当数据被限制在由分组变量指定的子集中时。
使用summarize()可以这样吗?

这解决了问题 - 谢谢akrun! - Mark T Patterson
2个回答

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

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

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