使用“summarise”的数据帧列的第二个(或第三个)最大值

Y.C*_*och 5 r max dataframe dplyr

假设我有一个像这样的数据框:

group1 <- c('a','a','a','a','a','a','b','b','b','b','b','b','b','b')
group2 <- c('x','y','x','y','x','y','x','y','x','y','x','y','x','y')
value <- round(runif(14, min=0, max=1), digits = 2)

df1 <- as.data.frame(cbind(group1,group2,value))
df1$value <- as.numeric(df1$value)
Run Code Online (Sandbox Code Playgroud)

dplyr通过使用包和函数,可以轻松获得仅包含每组最大值的新数据框summarise

df2 <- summarise(group_by(df1,group1),max_v = max(value))
Run Code Online (Sandbox Code Playgroud)

但我想要的是一个新的数据框,其中包含每组的 3 个最大值,执行类似的操作:

df2 <- summarise(group_by(df1,group1),max_v = max(value),max2_v = secondmax(value),max3_v = thirdmax(value))
Run Code Online (Sandbox Code Playgroud)

有没有办法在不使用该功能的情况下做到这一点sort

akr*_*run 3

我们可以使用arrange/slice/spread方法来得到这个

library(dplyr)
library(tidyr)
df1 %>%
  group_by(group1) %>%
  arrange(desc(value)) %>% 
  slice(seq_len(3)) %>%
  mutate(Max = paste0("max_", row_number())) %>%
  select(-group2) %>% 
  spread(Max, value)
# A tibble: 2 x 4
# Groups:   group1 [2]
#   group1 max_1 max_2 max_3
#* <fctr> <dbl> <dbl> <dbl>
#1      a  0.84  0.69  0.41
#2      b  0.89  0.72  0.54
Run Code Online (Sandbox Code Playgroud)

数据

df1 <- data.frame(group1,group2,value)
Run Code Online (Sandbox Code Playgroud)