以下函数从数据集中提取线性回归模型。
eqlabels <- function(data, x, y){
m <- lm(x ~ y, data);
eq <- substitute(italic(y) == a + b * italic(x) * "," ~~ italic(r) ^ 2 ~ "=" ~ r2,
list(a = format(coef(m)[1], digits = 3),
b = format(coef(m)[2], digits = 3),
r2 = format(summary(m)$r.squared, digits = 2)))
as.character(as.expression(eq));
return(eq)
}
我们可以看到它正常工作
s <- eqlabels(data = iris, x = iris$Sepal.Length, y = iris$Sepal.Width)
s
italic(y) == "6.53" + "-0.223" * italic(x) * "," ~ ~italic(r)^2 ~
"=" ~ "0.014"
问题是如何使用此函数与dplyr计算方程式和r2值不是针对一个组,而是针对多个组。例如:
result <- iris %>% group_by(Species) %>% eqlabels(x = iris$Sepal.Length, y = iris$Sepal.Width)
这似乎有效,但它只产生一个,而不是三组方程和r2。
> result
italic(y) == "6.53" + "-0.223" * italic(x) * "," ~ ~italic(r)^2 ~
"=" ~ "0.014"
?似乎是一个dplyr功能,但我不能让它工作......
result <- iris %>% group_by(Species) %>% do(eqlabels(x = iris$Sepal.Length, y = iris$Sepal.Width),.)
此表达式暂停函数...
请注意,我正试图避免在plyr包中使用ddply。 谢谢
答案 0 :(得分:1)
尝试:
result <- iris %>% group_by(Species) %>%
summarise(labels = list(eqlabels(., x = .$Sepal.Length, y = .$Sepal.Width)))
Source: local data frame [3 x 2]
Species labels
(fctr) (chr)
1 setosa <call[3]>
2 versicolor <call[3]>
3 virginica <call[3]>
如果您希望dplyr
能够与group_by
很好地协作,则需要传递mutate
,summarise
或do
,而不是您自己的功能。你的函数的输出也不是很好 - 我把它包装在一个列表中:
result$labels[[1]]
italic(y) == "6.53" + "-0.223" * italic(x) * "," ~ ~italic(r)^2 ~
"=" ~ "0.014"
正如上面的评论所提到的,你应该使用broom
套餐,它会让你的生活更轻松。