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