为什么dplyr::do()允许。是否引用当前组,但dplyr::summary()不引用?
我目前对为什么dplyr::do()允许。是否引用当前组,但dplyr::summary()不引用?,r,dplyr,R,Dplyr,我目前对dplyr中的一个我似乎无法理解的特定行为感到挠头。对于分组数据,do允许对当前组执行操作,但在摘要中,指的是整个数据,而不是每个组。为什么会这样 library(dplyr) df <- data.frame( hour = factor(rep(1:24, each = 21)), price = runif(504, min = -10, max = 125) ) df %>% group_by(hour) %>% summaris
dplyr
中的一个我似乎无法理解的特定行为感到挠头。对于分组数据,do
允许对当前组执行
操作,但在摘要中,
指的是整个数据,而不是每个组。为什么会这样
library(dplyr)
df <- data.frame(
hour = factor(rep(1:24, each = 21)),
price = runif(504, min = -10, max = 125)
)
df %>% group_by(hour) %>%
summarise(mean(price))
# # A tibble: 24 x 2
# hour `mean(price)`
# <fctr> <dbl>
# 1 1 58.78788
# 2 2 55.51119
# 3 3 54.44470
# [...]
df %>% group_by(hour) %>%
summarise(mean(.$price))
# # A tibble: 24 x 2
# hour `mean(.$price)`
# <fctr> <dbl>
# 1 1 54.66447
# 2 2 54.66447
# 3 3 54.66447
# [...]
mean(df$price)
# [1] 54.66447
df %>% group_by(hour) %>%
do(as.data.frame(mean(.$price)))
# # A tibble: 24 x 2
# # Groups: hour [24]
# hour `mean(.$price)`
# <fctr> <dbl>
# 1 1 58.78788
# 2 2 55.51119
# 3 3 54.44470
# [...]
库(dplyr)
df%分组单位(小时)%>%
总结(平均值(价格))
##tibble:24 x 2
#小时平均值(价格)`
#
# 1 1 58.78788
# 2 2 55.51119
# 3 3 54.44470
# [...]
df%%>%分组单位(小时)%%>%
总结(平均值(.$价格))
##tibble:24 x 2
#小时平均值(.$价格)`
#
# 1 1 54.66447
# 2 2 54.66447
# 3 3 54.66447
# [...]
平均值(df$价格)
# [1] 54.66447
df%%>%分组单位(小时)%%>%
do(如.data.frame(平均(.$price)))
##tibble:24 x 2
##小组:小时[24]
#小时平均值(.$价格)`
#
# 1 1 58.78788
# 2 2 55.51119
# 3 3 54.44470
# [...]
可以看出,只有总结
而不使用
和do
而使用
才能产生预期的结果(即对分组变量进行聚合)<代码>摘要
和
只返回总体平均值
我知道为什么问题可能不是最适合这样做的问题,但由于
dplyr
应该是直观的,而这对我来说似乎一点也不直观,我希望这是可以的。因为您通过提取$price
得到整个专栏的平均值。这就像做mean(df$price)
。do
这样做和summary
不这样做的原因应该与源代码相关。在
摘要中,默认选项是仅在分组后指定列名。因此,如果您想将该列提取为$price
,它将对整个列执行此操作(在某些情况下可能很有用)。在do
中,如果我们想这样做,您可以称为mean(df$price)
而不是df$price
,因为summary
和do
中都可以使用。这里的语法以这种微妙的方式不同,有什么具体原因吗?