代码之家  ›  专栏  ›  技术社区  ›  Makoto Miyazaki

在groupby之后的多个列中应用不同的函数

  •  4
  • Makoto Miyazaki  · 技术社区  · 7 年前

    我正在努力申请 head(1) 对于列,聚合到另一列,逻辑表达式聚合到groupby之后的另一列。

    我有一个数据框 df 这样地:

    df <- data.frame(ref = c(rep("123", 3), rep("456", 3), rep("789", 4)),
                     carrier = c("A", "A", "B", "C", "C", "C", "D", "E", "F", "A"), 
                     distance = c(20, 10, 40, 20, 90, 30, 20, 20, 30, 70),
                     stringsAsFactors = FALSE)
    
    
    >df
    ref    carrier    distance
    123          A          20
    123          A          10
    123          B          40
    456          C          20
    456          C          90
    456          C          30
    789          D          20
    789          E          20
    789          F          30
    789          A          70
    

    我想在下面做这些事情。

    1. 分组依据 ref

    2. 使柱突变 first_carrier 其中 carrier 返回每组的列

    3. 使柱突变 agg_distance 其中 distance 返回每组中的列

    4. 使柱突变 plus_100 如果 agg_距离 大于350,错误小于100。

    所以结果应该是这样的。

    ref  first_carrier  agg_distance  plus_100
    123              A            70     FALSE
    456              C           140      TRUE  
    789              D           140      TRUE
    

    我的尝试:

      df_new <- df %>%
        group_by(ref) %>%
        mutate("agg_distance" = summarise(sum(distance)) %>%
        mutate("plus_100" = ifelse(agg_distance >= 100, T, F))
    

    但我只是不知道如何在每个小组第一个承运人。

    2 回复  |  直到 7 年前
        1
  •  1
  •   Andre Elrico    7 年前

    这是一个 data.table verion由@LAP输入制成:

    请用手舔一下

    df<-
    setDT(df)[,.(first_carrier = carrier[1],
                 agg_distance  = sum(distance)),by="ref"][,plus_100 := ifelse(agg_distance >= 100, T, F)]
    
    #> df
    #   ref first_carrier agg_distance plus_100
    #1: 123             A           70    FALSE
    #2: 456             C          140     TRUE
    #3: 789             D          140     TRUE
    
        2
  •  2
  •   LAP    7 年前

    你几乎是一个人干的。 summarise 使用时没有 mutate . 要得到第一个载体,只需打电话到 carrier 分组后的列。

    library(dplyr)
    
    df_new <- df %>%
      group_by(ref) %>%
      summarise(first_carrier = carrier[1],
                agg_distance = sum(distance),
                plus_100 = ifelse(agg_distance >= 100, T, F))
    
    # A tibble: 3 x 4
        ref first_carrier agg_distance plus_100
      <chr>         <chr>        <dbl>    <lgl>
    1   123             A           70    FALSE
    2   456             C          140     TRUE
    3   789             D          140     TRUE