我想定义类似于'扫帚中的功能。封装
library(dplyr)
library(broom)
mtcars %>%
group_by(am) %>%
do(model = lm(mpg ~ wt, .)) %>%
glance(model)
工作正常。但是我如何定义像
这样的自定义函数myglance <- function(x, ...) {
s <- summary(x)
ret <- with(s, data.frame(r2=adj.r.squared, a=coefficients[1], b=coefficients[2]))
ret
}
mtcars %>%
group_by(am) %>%
do(model = lm(mpg ~ wt, .)) %>%
myglance(model)
eval中的错误(替换(expr),数据,enclos = parent.frame()): 无效&#39; envir&#39;类型&#39;
的参数答案 0 :(得分:3)
glance
以这种方式工作,因为扫帚包为行方向数据帧here定义了一种方法。如果您愿意引入整个.R文件(以及here中的col_name
实用程序),您可以使用我的代码执行相同的操作:
myglance_df <- wrap_rowwise_df(wrap_rowwise_df_(myglance))
mtcars %>%
group_by(am) %>%
do(model = lm(mpg ~ wt, .)) %>%
myglance_df(model)
还有一种解决方法,不需要从扫帚中添加如此多的代码:更改每个模型的类,并定义自己的 em>在该班上一瞥功能。
glance.mylm <- function(x, ...) {
s <- summary(x)
ret <- with(s, data.frame(r2=adj.r.squared, a=coefficients[1], b=coefficients[2]))
ret
}
mtcars %>%
group_by(am) %>%
do(model = lm(mpg ~ wt, .)) %>%
mutate(model = list(structure(model, class = c("mylm", class(model))))) %>%
glance(model)
最后,您还可以选择立即在模型上执行myglance
。
mtcars %>%
group_by(am) %>%
do(myglance(lm(mpg ~ wt, .)))
答案 1 :(得分:1)
以下是我对它如何工作的看法,基本上方法是:
从数据框中提取相应的列(我的解决方案基于this answer,必须是更好的方式,我希望有人会纠正我!
对结果运行lapply
,并在上面的myglance
函数中构建所需的变量。
使用do.call
运行rbind
以返回data.frame
。
myglance <- function(df, ...) {
# step 1
s <- collect(select(df, ...))[[1]] # based on this answer: https://stackoverflow.com/a/21629102/1992167
# step 2
lapply(s, function(x) {
data.frame(r2 = summary(x)$adj.r.squared,
a = summary(x)$coefficients[1],
b = summary(x)$coefficients[2])
}) %>% do.call(rbind, .) # step 3
}
输出:
> mtcars %>%
+ group_by(am) %>%
+ do(model = lm(mpg ~ wt, .)) %>%
+ myglance(model)
r2 a b
1 0.5651357 31.41606 -3.785908
2 0.8103194 46.29448 -9.084268