考虑下一个数据集:
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]
答案 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