代码之家  ›  专栏  ›  技术社区  ›  SkyWalker

如何分组并获取具有X max的列Y的值?[副本]

  •  3
  • SkyWalker  · 技术社区  · 7 年前

    我有一个以前从未遇到过的用例。我有以下数据框,希望选择“y”的值,其中“x”在条件“I”的每个级别分别达到其最小值和最大值。

    > 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 谁的 x Min Max .

      i Min Max
      1   a   b
      2   c   d
    

    我该怎么做?

    4 回复  |  直到 7 年前
        1
  •  4
  •   akrun    7 年前

    我们可以使用 slice

    library(dplyr)
    df %>% 
       group_by(i) %>% 
       slice(which.min(x)) %>%
       #or
       #slice(which.max(x)) %>%
       select(-x)
    
        2
  •  3
  •   jrlewi    7 年前
         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
  •  3
  •   Mike H.    7 年前

    如果您愿意走出 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
    
        4
  •  1
  •   AdamO    7 年前

    base 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