为什么将filter()放在不同的位置会得到不同的直方图?

为什么将filter()放在不同的位置会得到不同的直方图?,r,ggplot2,data-visualization,tidyverse,R,Ggplot2,Data Visualization,Tidyverse,下面是用于比较的两段代码-请注意,筛选器(n()>=100)的位置不同: library(tidyverse) library(dslabs) movielens %>% group_by(userId) %>% filter(n() >= 100) %>% summarise(mean_rating = mean(rating)) %>% ggplot(aes(mean_rating)) + geom_histogram(bins=30, co

下面是用于比较的两段代码-请注意,筛选器(n()>=100)的位置不同:

library(tidyverse)
library(dslabs)
movielens %>%
  group_by(userId) %>%
  filter(n() >= 100) %>%
  summarise(mean_rating = mean(rating)) %>%
  ggplot(aes(mean_rating)) +
  geom_histogram(bins=30, col="black")


这两段代码给出了两个不同的直方图。为什么会这样?它们不应该做相同的事情吗?

在聚合函数(如Summary)后,“分组”没有意义,将被删除,n()返回完整数据帧的行数,而不是每个用户ID,比较这两个命令的输出:

movielens %>%
  group_by(userId) %>%
  summarise(mean_rating = mean(rating)) %>%
  mutate(n = n())
# # A tibble: 671 x 3
# userId mean_rating     n
#    <int>       <dbl> <int>
# 1      1        2.55   671
# 2      2        3.49   671
# 3      3        3.57   671

movielens %>%
  group_by(userId) %>%
  summarise(mean_rating = mean(rating)) %>%
  group_by(userId) %>% 
  mutate(n = n())

# # A tibble: 671 x 3
# # Groups:   userId [671]
# userId mean_rating     n
#    <int>       <dbl> <int>
# 1      1        2.55     1
# 2      2        3.49     1
# 3      3        3.57     1
movierens%>%
分组人(用户ID)%>%
总结(平均(评级=平均(评级))%>%
变异(n=n())
##A tible:671 x 3
#用户ID平均值
#            
# 1      1        2.55   671
# 2      2        3.49   671
# 3      3        3.57   671
电影%>%
分组人(用户ID)%>%
总结(平均(评级=平均(评级))%>%
分组人(用户ID)%>%
变异(n=n())
##A tible:671 x 3
##组:userId[671]
#用户ID平均值
#            
# 1      1        2.55     1
# 2      2        3.49     1
# 3      3        3.57     1

在summary()之后,数据帧不是一个分组对象,过滤器不做任何事情,而在第一个示例中,您对分组对象应用过滤器(只有263个用户ID满足您的条件),然后将结果导入summary()。希望这能有所帮助。

不,尝试使用第一个脚本的前两行(当然不是
library()
),第二个脚本的前三行,然后您将看到差异,它应用于
filter()
movielens %>%
  group_by(userId) %>%
  summarise(mean_rating = mean(rating)) %>%
  mutate(n = n())
# # A tibble: 671 x 3
# userId mean_rating     n
#    <int>       <dbl> <int>
# 1      1        2.55   671
# 2      2        3.49   671
# 3      3        3.57   671

movielens %>%
  group_by(userId) %>%
  summarise(mean_rating = mean(rating)) %>%
  group_by(userId) %>% 
  mutate(n = n())

# # A tibble: 671 x 3
# # Groups:   userId [671]
# userId mean_rating     n
#    <int>       <dbl> <int>
# 1      1        2.55     1
# 2      2        3.49     1
# 3      3        3.57     1