【问题标题】:Why does putting filter() in different positions give different histograms?为什么将 filter() 放在不同的位置会给出不同的直方图?
【发布时间】:2020-03-30 08:39:19
【问题描述】:

下面是 2 块代码用于比较 - 注意 filter(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")

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

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

【问题讨论】:

  • 不,尝试使用第一个脚本的前两行(当然不是library())和第二个脚本的前三行,你会看到不同之处,它的应用filter().

标签: r ggplot2 data-visualization tidyverse


【解决方案1】:

summarise 等聚合函数之后,“分组”没有意义并被删除,n() 返回完整 dataframe 的行数,而不是每个userId,比较这两条命令的输出:

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

【讨论】:

    【解决方案2】:

    在 summarise() 之后,数据框不是分组对象,过滤器不做任何事情,而在第一个示例中,您将过滤器应用于分组对象(只有 263 个用户 ID 满足您的条件),然后将结果通过管道传输到总结()。希望这会有所帮助。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-10-29
      • 1970-01-01
      • 1970-01-01
      • 2012-06-09
      • 2011-07-20
      • 2020-05-13
      • 2019-05-09
      相关资源
      最近更新 更多