使用 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()?
答案 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