如何在R语言中对数据框指定列批量应用函数列表
按分组应用自定义函数列表生成汇总表
问题场景
现有如下数据框:
| river | discharge |
|---|---|
| river1 | 500 |
| river1 | 450 |
| river1 | 200 |
| river1 | 250 |
| river2 | 375 |
| river2 | 235 |
| river2 | 130 |
| river2 | 250 |
需要按river分组,将以下自定义函数列表应用到discharge列,生成包含各统计量的宽格式汇总表:
# 需先加载lfstat包,lfquantile函数来自此包 library(lfstat) f <- list( mean = function(x, ...) mean(x), Q50 = function(x, ...) lfquantile(x, exc.freq = 0.5), Q95 = function(x, ...) lfquantile(x, exc.freq = 0.95), Q90 = function(x, ...) lfquantile(x, exc.freq = 0.9), Q70 = function(x, ...) lfquantile(x, exc.freq = 0.7) )
实现方案
方法1:使用dplyr(tidyverse生态)
适合习惯tidy语法的用户,代码简洁直观:
library(dplyr) # 创建示例数据框(已有数据可跳过此步骤) df <- data.frame( river = c("river1", "river1", "river1", "river1", "river2", "river2", "river2", "river2"), discharge = c(500, 450, 200, 250, 375, 235, 130, 250) ) # 分组计算各统计量 result_df <- df %>% group_by(river) %>% summarize(across(discharge, f, .names = "{.fn}")) %>% ungroup() print(result_df)
方法2:使用Base R
无需额外安装包,适合轻量场景:
# 创建示例数据框 df <- data.frame( river = c("river1", "river1", "river1", "river1", "river2", "river2", "river2", "river2"), discharge = c(500, 450, 200, 250, 375, 235, 130, 250) ) # 分组应用函数列表 result_base <- aggregate(discharge ~ river, data = df, FUN = function(x) { sapply(f, function(func) func(x)) }) # 转换为标准数据框格式 result_base <- do.call(data.frame, result_base) colnames(result_base) <- c("river", names(f)) print(result_base)
方法3:使用data.table
处理大数据集时效率更高:
library(data.table) # 创建示例data.table dt <- data.table( river = c("river1", "river1", "river1", "river1", "river2", "river2", "river2", "river2"), discharge = c(500, 450, 200, 250, 375, 235, 130, 250) ) # 分组计算各统计量 result_dt <- dt[, lapply(f, function(func) func(discharge)), by = river] print(result_dt)
输出结果
三种方法都会生成如下格式的汇总表(数值为实际计算结果):
| river | mean | Q50 | Q95 | Q90 | Q70 |
|---|---|---|---|---|---|
| river1 | 350 | 325 | 490 | 480 | 425 |
| river2 | 247.5 | 242.5 | 360 | 345 | 295 |
内容的提问来源于stack exchange,提问作者Faranak omidi
相关产品推荐
相关产品推荐

