【问题标题】:filter data by maximum group sample size with duplicate maximum values按具有重复最大值的最大组样本大小过滤数据
【发布时间】:2018-05-01 18:47:09
【问题描述】:

使用iris 数据集并添加如下创建的Year 列,我想按SpeciesYear 分组以选择Year,每个@ 的观察次数最多987654326@。

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

如下面的汇总表所示,20072008setosa 都有 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

【问题讨论】:

    标签: r dplyr


    【解决方案1】:

    你已经成功了一半。您只需按物种分组,根据您想要保留的内容进行排序,然后从每个物种中取第一行。

    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 %&gt;% slice 替换为filter(N == max(N))

    【讨论】:

    • filter(row_number() == 1) :-)
    • 或者:iris %&gt;% count(Species, Year) %&gt;% arrange(desc(n)) %&gt;% distinct(Species, .keep_all = TRUE) 或者更易读的iris %&gt;% count(Species, Year) %&gt;% group_by(Species) %&gt;% slice(which.max(n))
    • @Frank,我更喜欢明确我的决胜局,而不是依赖于不明确的排序行为。
    • @Gregor,我增加了清晰度以更好地描述期望的结果,这是iris 的子集,而不是汇总表的子集。
    • @B.Davis 接受我的回答并在末尾添加%&gt;% inner_join(iris) 以获得您想要的输出。
    猜你喜欢
    • 2015-02-16
    • 1970-01-01
    • 2017-12-20
    • 2021-06-12
    • 1970-01-01
    • 2019-11-09
    • 2018-10-09
    • 2016-10-09
    • 1970-01-01
    相关资源
    最近更新 更多