这可能很容易,但我自己找不到答案。
以虹膜数据集为例,我想使用以下查询来获得每个物种的最大花瓣宽度:
iris %>% group_by(Species) %>% summarise(max(Petal.Width))
返回以下结果:
# A tibble: 3 x 2
Species `max(Petal.Width)`
<fct> <dbl>
1 setosa 0.6
2 versicolor 1.8
3 virginica 2.5
现在,我想知道具有最大花瓣宽度值的每一行的花瓣长度。[1]我该怎么做?选择不起作用:
iris %>% group_by(Species) %>% select(Species,Petal.Length,Petal.Width) %>% summarise(max_val = max(Petal.Width))
因为我不知道花瓣长度属性仍然缺少。
1:例如,花瓣宽度为1.8,物种为云芝的那一行,花瓣长度为4.8,我想得到这些信息和结果。
将summarize
视为聚合行-将它们组合在一起。它与mean
、max
、n_distinct
等函数一起工作,这些函数提供列的单个数字摘要。
max
是一种特殊情况——它是一个单一的数字汇总函数,但实际上并没有组合值。在这种情况下,您不希望找到最大值,而是希望找到具有最大值的行。保留一个特定的行是filter
操作,而不是summarize
操作,所以我们可以用几种不同的方法来做。
## keep the row(s) with the maximum Petal Width
iris %>%
group_by(species) %>%
filter(Petal.Width == max(Petal.Width))
## sort by petal width and keep top row in each group
iris %>%
group_by(Species) %>%
## order the data by descending `Petal.Width`
arrange(desc(Petal.Width)) %>%
## keep the top row
slice(1)
## use the built-in function for this particular case!
iris %>%
group_by(Species) %>%
slice_max(Petal.Width)
这些基本上是相同的-如果具有最大花瓣宽度的行有平局,它们就会不同-slice(1)
方法将只保留一行,Petal.Width == max(Petal.Width)
方法将保留所有行的最大平局,slice_max
方法将允许您使用with_ties
参数进行选择(默认保留所有平局行(。