фильтровать данные по максимальному размеру выборки группы с повторяющимися максимальными значениями - PullRequest
0 голосов
/ 01 мая 2018

Используя набор данных iris с добавлением столбца Year, созданного ниже, я хочу сгруппировать по Species и Year, чтобы выбрать Year с максимальным количеством наблюдений для каждого species.

iris$Year <- c(rep(c("2007", "2008"), each = 25),
               rep(c("2007", "2008"), times = c(10, 40)),
               rep(c("2007", "2008"), times = c(40, 10)))
head(iris)
  Sepal.Length Sepal.Width Petal.Length Petal.Width Species Year
1          5.1         3.5          1.4         0.2  setosa 2007
2          4.9         3.0          1.4         0.2  setosa 2007
3          4.7         3.2          1.3         0.2  setosa 2007
4          4.6         3.1          1.5         0.2  setosa 2007
5          5.0         3.6          1.4         0.2  setosa 2007
6          5.4         3.9          1.7         0.4  setosa 2007

Как видно из сводной таблицы ниже, 2007 и 2008 имеют 25 наблюдений (строк) для setosa. Когда есть связи в количестве наблюдений, я хочу выбрать минимум Year.

Короче говоря, я пытаюсь выбрать только setosa 2007, versicolor 2008 и virginica 2007 из воспроизводимых данных, указанных выше, предпочтительно с использованием dplyr

РЕДАКТИРОВАТЬ Обратите внимание, что вместо создания сводной таблицы я хочу выбрать соответствующие комбинации вида и года из данных iris, созданных выше. Другими словами, я хочу включить в подмножество iris только setosa 2007, versicolor 2008 и virginica 2007 (т.е. минимальный год с максимальным количеством наблюдений). Извините за путаницу. Конец редактирования

library(dplyr)
iris %>%
  group_by(Species, Year) %>%
  summarise(N = n()) %>%
  as.data.frame()

     Species Year  N
1     setosa 2007 25
2     setosa 2008 25
3 versicolor 2007 10
4 versicolor 2008 40
5  virginica 2007 40
6  virginica 2008 10

1 Ответ

0 голосов
/ 01 мая 2018

Вы на полпути. Вам нужно сгруппировать по видам, отсортировать по тому, что вы хотите сохранить, и взять верхний ряд от каждого вида.

iris %>%
  group_by(Species, Year) %>%
  summarise(N = n()) %>%
  group_by(Species) %>%
  arrange(desc(N), Year) %>%
  slice(1)
# # A tibble: 3 x 3
# # Groups:   Species [3]
#      Species  Year     N
#       <fctr> <chr> <int>
# 1     setosa  2007    25
# 2 versicolor  2008    40
# 3  virginica  2007    40

Если вы хотите сохранить связи, а не разорвать их, вы можете заменить arrange %>% slice на filter(N == max(N)).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...