dplyr::group_by_ 和 dplyr::summarise_ 中的异常行为

Unexpected behavior in dplyr::group_by_ and dplyr::summarise_

我编写了这个小函数来查找对 mtcars 数据集中的两个变量执行的回归的 R 平方值,默认包含在 R 中:

get_r_squared = function(x) summary(lm(mpg ~ hp, data = x))$r.squared

当我给它完整的数据集时,它似乎按预期工作:

get_r_squared(mtcars)
# [1] 0.6024373

但是,如果我尝试将它用作数据子集上 dplyr 管道的一部分,它 return 与上面的答案相同三次,而我期望它 return 每个子集的不同值。

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 的工作原理?还是别的什么?

试试 do

mtcars %>%
     group_by(cyl) %>% 
     do(data.frame(r_squared=get_r_squared(.)))

我认为您误解了 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))