【问题标题】:R collapse multiple rows into 1 row using specific function to each columnR使用每列的特定功能将多行折叠成1行
【发布时间】:2017-11-10 17:30:00
【问题描述】:

考虑下一个数据集:

id <- c(1,1,1,2,2,2)
col_a <- c(123,56,87,987,1003,10)
col_b <- c(17,234,20,88,765,69)
col_c <- c(45,90,543,NA,1,543)
df <- data.frame(id,col_a,col_b,col_c)
library(data.table)
setDT(df)

使用按 id 分组我需要为每列应用不同的功能: 例如:col_a 为 min,col_b 为中值,col_c 为 max,生成下一个结果:

id  col_a col_b col_c
1   56    20   543
2   10    88   543

需要完成这样的解决方案:

df[, lapply(.SD, ???), by=id]  

【问题讨论】:

    标签: r data.table


    【解决方案1】:

    使用tidyverse,您可以执行以下操作:

    library(tidyverse)
    
    df %>% 
      group_by(id) %>% 
      mutate(col_a = min(col_a),
             col_b = median(col_b),
             col_c = max(col_c, na.rm = TRUE)) %>% 
      distinct()
    

    这给出了:

    # A tibble: 2 x 4
    # Groups:   id [2]
         id col_a col_b col_c
      <dbl> <dbl> <dbl> <dbl>
    1     1    56    20   543
    2     2    10    88   543
    

    【讨论】:

      【解决方案2】:

      我们可以使用Map将每个函数应用到按'id'分组的对应列

      df[, Map(function(x,y) get(x)(y, na.rm = TRUE), 
             setNames(c('min', 'median', 'max'),names(.SD)), .SD), by = id]
      #   id col_a col_b col_c
      #1:  1    56    20   543
      #2:  2    10    88   543
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-04-23
        • 1970-01-01
        • 1970-01-01
        • 2016-12-10
        • 2021-11-25
        相关资源
        最近更新 更多