如何分组并得到具有X max的Y列的值?

时间:2017-12-29 16:29:01

标签: r dataframe dplyr

我有一个以前没见过的用例。我有以下数据框,并希望选择" y"的值。在哪里" x"对于条件的每个级别分别达到其最小值和最大值

> library(dplyr) 
> df <- data.frame(i=c(1,1,2,2),x=c(1.0,2.0,3.0,4.0),y=c('a','b','c','d'))
> ddply(df, .(i), summarise, Min=min(x), Max=max(x))
  i Min Max
  1   1   2
  2   3   4

这是正确的,但我希望y xMinMax

  i Min Max
  1   a   b
  2   c   d

我该怎么做?

4 个答案:

答案 0 :(得分:4)

我们可以使用slice

library(dplyr)
df %>% 
   group_by(i) %>% 
   slice(which.min(x)) %>%
   #or
   #slice(which.max(x)) %>%
   select(-x)

答案 1 :(得分:3)

如果您愿意超出tidyverse范围,则另一种选择是data.table

setDT(df)[, list(min = y[which.min(x)],
                 max = y[which.max(x)]), by = i]

#   i min max
#1: 1   a   b
#2: 2   c   d

答案 2 :(得分:3)

     library(plyr)
     df <- data.frame(i=c(1,1,2,2),x=c(1.0,2.0,3.0,4.0),y=c('a','b','c','d'))
     ddply(df, .(i), summarise, Min=y[which.min(x)], Max=y[which.min(x)])

答案 3 :(得分:1)

基础R的解决方案:

output <- by(df, df[, "i"], with, {
  data.frame(i=i[1], min=y[which.min(x)], max=y[which.max(x)])
})

给出

> output
df[, "i"]: 1
  i min max
1 1   a   b
------------------------------------------------------------ 
df[, "i"]: 2
  i min max
1 2   c   d

(data.frame对于保留“y”的因子结构是必要的。我相信。)

输出可以与do.call(rbind, output)

连接
> do.call(rbind, output)
  i min max
1 1   a   b
2 2   c   d