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))
我编写了这个小函数来查找对 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))