dplyr :: group_by_和dplyr :: summaryrize _

时间:2015-04-26 00:05:39

标签: r dplyr

我写了这个小函数来找到对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的工作原理?或许别的什么?

2 个答案:

答案 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))