按最大组样本大小过滤数据,并使用重复的最大值

时间:2018-05-01 18:47:10

标签: r dplyr

使用iris数据集添加了下面创建的Year列,我想按SpeciesYear进行分组,以选择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

如下面的摘要表所示,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 个答案:

答案 0 :(得分: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

如果你想保持关系而不是打破关系,你可以用arrange %>% slice替换filter(N == max(N))