Почему установка filter () в разные позиции дает разные гистограммы? - PullRequest
1 голос
/ 30 марта 2020

Ниже приведены 2 фрагмента кода для сравнения - обратите внимание, что положение фильтра (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")

Эти два фрагмента кода дают две разные гистограммы. Почему это так? Разве они не должны делать одно и то же?

Ответы [ 2 ]

1 голос
/ 30 марта 2020

после summaze () кадр данных не является сгруппированным объектом, и фильтр ничего не делает, тогда как в первом примере вы применяете фильтр к сгруппированному объекту (только 263 идентификатора пользователя удовлетворяют вашему условию), а затем передаете результат в подводить итоги(). Надеюсь, это поможет.

1 голос
/ 30 марта 2020

После того, как агрегатные функции, такие как суммируют , «группировка» не имеет смысла и удаляется, а n () возвращает число строк для полного фрейма данных вместо каждого идентификатора пользователя, сравните вывод этих двух команд:

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
...