我写了这个小函数来找到对mtcars
数据集中的两个变量执行的回归的R平方值,默认情况下包含在R中:
get_r_squared = function(x) summary(lm(mpg ~ hp, data = x))$r.squared
当我给它完整的数据集时,似乎按预期工作:
get_r_squared(mtcars)
# [1] 0.6024373
但是,如果我尝试将其用作数据子集上dplyr
管道的一部分,则当我预期它为每个子集返回不同的值时,它会返回与上述相同的答案三次。
library(dplyr)
mtcars %>%
group_by_("cyl") %>%
summarise_(r_squared = get_r_squared(.))
## Source: local data frame [3 x 2]
##
## cyl r_squared
## 1 4 0.6024373
## 2 6 0.6024373
## 3 8 0.6024373
我希望这些值看起来像这样
sapply(
unique(mtcars$cyl),
function(cyl){
get_r_squared(mtcars[mtcars$cyl == cyl, ])
}
)
# [1] 0.01614624 0.27405583 0.08044919
我已确认这不是plyr
命名空间问题:未加载该包。
search()
## [1] ".GlobalEnv" "package:knitr" "package:dplyr"
## [4] "tools:rstudio" "package:stats" "package:graphics"
## [7] "package:grDevices" "package:utils" "package:datasets"
## [10] "package:methods" "Autoloads" "package:base"
我不确定这里发生了什么。它可能与lm
函数中的非标准评估有关吗?或者我只是误解了group_by
的工作原理?或许别的什么?
答案 0 :(得分:3)
尝试使用do
mtcars %>%
group_by(cyl) %>%
do(data.frame(r_squared=get_r_squared(.)))
答案 1 :(得分:2)
我认为你误解了summarise()
的工作原理 - 它与.
没有任何关系,而且它完全有效的事实只是幸福的机会。相反,尝试这样的事情:
library(dplyr)
get_r_squared <- function(x, y) summary(lm(x ~ y))$r.squared
mtcars %>%
group_by(cyl) %>%
summarise(r_squared = get_r_squared(mpg, wt))