R使用特定函数将多行折叠为一行到每一列

时间:2017-11-10 17:30:01

标签: r data.table

考虑下一个数据集:

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分组我需要为每个列申请不同的功能: 例如:min为col_a,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]  

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:0)

我们可以使用Map将每个功能应用于按&#39; id&#39;

分组的相应列
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