【问题标题】:second (or third) maximum value of a dataframe column using 'summarise'使用“总结”的数据框列的第二个(或第三个)最大值
【发布时间】:2018-01-02 06:51:01
【问题描述】:

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

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)

使用dplyr包和summarise函数,很容易得到一个只有每组最大值的新数据框:

df2 <- summarise(group_by(df1,group1),max_v = max(value))

但我想要的是一个新的数据框,每组有 3 个最大值,做这样的事情:

df2 <- summarise(group_by(df1,group1),max_v = max(value),max2_v = secondmax(value),max3_v = thirdmax(value))

有没有办法在不使用sort 函数的情况下做到这一点?

【问题讨论】:

  • 你可以使用arrange函数来避免使用sort 即`df1 %>% group_by(group1) %>%arrange(desc(value)) %>% slice(seq_len(3) ) %>% mutate(max = row_number()) %>% select(-group2) %>% spread(max, value)`
  • dplyr 与管道运算符 %&gt;% 很好地配对。它会让你的代码更容易阅读。
  • 我猜,原则上df1 %&gt;% group_by(group1) %&gt;% slice(nth(row_number(), 1:3, order_by = -value)) 应该获得前三名。不幸的是,包作者决定nth() 一次只能返回一个数字......无论如何,@akrun 的答案有效(需要 tidyr)。看起来值得发布。
  • @Frank 谢谢,但我认为 OP 的意图并不明确,因为它指定不使用 sort 和排序家族函数
  • @akrun OP 可能是错误的。您的解决方案非常合理。

标签: r dataframe dplyr max


【解决方案1】:

我们可以使用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

数据

df1 <- data.frame(group1,group2,value)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-12-20
    • 2013-05-24
    • 1970-01-01
    • 2016-07-18
    • 2018-04-09
    • 2016-08-20
    • 2022-09-22
    • 1970-01-01
    相关资源
    最近更新 更多