【问题标题】:Grouping by ID column and collapsing Boolean columns for summary按 ID 列分组并折叠布尔列以进行汇总
【发布时间】:2018-06-29 23:04:44
【问题描述】:

尝试将具有重复 ID 行的多个布尔列的数据帧转换为一个新数据帧,其中每个 ID 只有一个条目,但布尔值组合用于 ID 组。我也想记下最新的日期值。

示例输入:

     ID S1 S2 S3 S4  Date
1   ex1  1  0  0  0  4/7/12
2   ex1  0  1  0  0  6/8/16
3   ex2  0  0  1  0  5/5/15
4   ex3  1  1  0  0  4/19/13
5   ex3  0  1  0  1  6/7/15
6   ex4  0  1  0  0  8/7/09
7   ex5  1  1  1  0  6/12/17

期望的输出:

    ID S1 S2 S3 S4  Date
   ex1  1  1  0  0  6/8/16
   ex2  0  0  1  0  5/5/15
   ex3  1  1  0  1  6/7/15
   ex4  0  1  0  0  8/7/09
   ex5  1  1  1  0  6/12/17

【问题讨论】:

    标签: r dataframe dplyr


    【解决方案1】:

    简单总结如下-

    df <- df %>% group_by(ID) %>% summarize( S1=max(S1), S2 =max(S2), S3 =max(S3), S4 = max(S4), Date = max(Date) )
    

    【讨论】:

      【解决方案2】:
      library(data.table)
      setDT(df)
      
      df[, lapply(.SD, max), ID]
      
      #     ID S1 S2 S3 S4       Date
      # 1: ex1  1  1  0  0 2016-06-08
      # 2: ex2  0  0  1  0 2015-05-05
      # 3: ex3  1  1  0  1 2015-06-07
      # 4: ex4  0  1  0  0 2009-08-07
      # 5: ex5  1  1  1  0 2017-06-12
      

      这也有效:

      library(dplyr)
      df %>% 
        group_by(ID) %>% 
        summarise_all(max)
      

      或者在基础 R 中:

      do.call(rbind
              , lapply(split(df, df$ID)
                       , function(g) data.frame(lapply(g, max))))
      

      使用的数据:

      df <- fread("
      a     ID S1 S2 S3 S4  Date
      1   ex1  1  0  0  0  4/7/12
      2   ex1  0  1  0  0  6/8/16
      3   ex2  0  0  1  0  5/5/15
      4   ex3  1  1  0  0  4/19/13
      5   ex3  0  1  0  1  6/7/15
      6   ex4  0  1  0  0  8/7/09
      7   ex5  1  1  1  0  6/12/17
      ")[, -1]
      df[, Date := lubridate::mdy(Date)]
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2016-11-15
        • 2022-11-18
        • 1970-01-01
        • 2015-07-26
        • 2021-04-29
        • 2016-12-31
        • 1970-01-01
        相关资源
        最近更新 更多