【问题标题】:Pass function to data after group_by()在 group_by() 之后将函数传递给数据
【发布时间】:2015-11-28 16:19:13
【问题描述】:

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

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"

?do 似乎是一个 dplyr 函数,但我无法让它工作......

result <- iris %>% group_by(Species) %>% do(eqlabels(x = iris$Sepal.Length, y = iris$Sepal.Width),.)

这个表达式停止函数...

请注意,我试图避免使用 plyr 包中的 ddply。 谢谢

【问题讨论】:

  • 我建议看看扫帚和咕噜包。
  • 感谢@Richard Scriven。我已经试过了。你是对的,在这种情况下,不需要使用iris$,但是没有它,函数就会中断......也许需要重新制作函数才能处理吹笛者,或者'group_by ()',或者两者都...?

标签: r dplyr


【解决方案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]>

如果您希望dplyrgroup_by 很好地协同工作,您需要将mutatesummarisedo 传递给它,而不是您自己的函数。您的函数的输出也不是特别好 - 我已将其包装在一个列表中:

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

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

【讨论】:

    猜你喜欢
    • 2015-12-13
    • 2016-01-22
    • 2021-01-19
    • 2015-12-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-02-27
    相关资源
    最近更新 更多