在group_by()之后将函数传递给数据

时间:2015-11-28 16:19:14

标签: r dplyr

以下函数从数据集中提取线性回归模型。

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。 谢谢

1 个答案:

答案 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很好地协作,则需要传递mutatesummarisedo,而不是您自己的功能。你的函数的输出也不是很好 - 我把它包装在一个列表中:

result$labels[[1]]
italic(y) == "6.53" + "-0.223" * italic(x) * "," ~ ~italic(r)^2 ~ 
    "=" ~ "0.014"

正如上面的评论所提到的,你应该使用broom套餐,它会让你的生活更轻松。

相关问题