按最大组样本大小筛选数据,同时考虑具有重复最大值的情况。

3
使用以下创建的带有Year列的iris数据集,我想按SpeciesYear分组,选择每个species观测次数最多的Year
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

如下所示的摘要表格显示,20072008都有setosa的25个观察值(行)。当观测数量存在并列时,我希望选择最小的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个回答

4
你已经完成了一半。你需要根据物种分组,并按照想要保留的方式进行排序,然后从每个物种中取出顶部行。
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

如果你想保留连接而不是断开它们,你可以用filter(N == max(N))代替arrange %>% slice


或者 filter(row_number() == 1) :-) - pogibas
或者:iris %>% count(Species, Year) %>% arrange(desc(n)) %>% distinct(Species, .keep_all = TRUE) 或者更易读的 iris %>% count(Species, Year) %>% group_by(Species) %>% slice(which.max(n)) - Frank
1
@Frank,我更喜欢明确我的决策标准,而不是依赖于不明确的排序行为。 - Gregor Thomas
@Gregor,我增加了描述所需结果的清晰度,这是iris的子集,而不是摘要表的子集。 - B. Davis
1
@B.Davis 可以采用我的答案,并在末尾添加 %>% inner_join(iris) 以获得您想要的输出。 - Gregor Thomas

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接