基于列名共性的自适应函数:按组计算指数和
自适应计算指数和的解决方案
下面提供两种自适应的函数实现,无需提前指定变量组名称,自动从数据框列名识别int_/eff_配对的变量组,完成计算后每行生成唯一的求和值,适配任意数量的变量组。
Tidyverse 实现
利用dplyr的across和pick函数批量处理变量组,代码简洁易读:
library(tidyverse) calc_adaptive_sum <- function(df, new_col = "sum_exp") { # 自动提取所有变量组名称(从int_前缀列中获取) groups <- str_remove(grep("^int_", colnames(df), value = TRUE), "^int_") df %>% # 为每个组计算exp(int_* + eff_*),生成临时列 mutate(across(all_of(groups), ~exp(pick(paste0("int_", .x)) + pick(paste0("eff_", .x))), .names = "exp_{.col}")) %>% # 对所有临时列按行求和,生成目标列 mutate({{new_col}} := rowSums(select(., starts_with("exp_")))) %>% # 可选:移除临时计算列(若不需要保留中间结果) select(-starts_with("exp_")) } # 测试df1 df1_result <- calc_adaptive_sum(df1, "eq_df1") print(df1_result) # 测试df2 df2_result <- calc_adaptive_sum(df2, "eq_df2") print(df2_result)
运行后生成的eq_df1/eq_df2列与预期结果完全一致。
基础R 实现
如果不依赖tidyverse包,可使用基础R的循环和列操作完成:
calc_adaptive_sum_base <- function(df, new_col = "sum_exp") { # 识别所有int_前缀的列,提取对应的组名 int_cols <- grep("^int_", colnames(df), value = TRUE) groups <- sub("^int_", "", int_cols) # 初始化求和向量 sum_exp <- numeric(nrow(df)) # 遍历每个组,累加指数计算结果 for (grp in groups) { int_vals <- df[[paste0("int_", grp)]] eff_vals <- df[[paste0("eff_", grp)]] sum_exp <- sum_exp + exp(int_vals + eff_vals) } # 将结果添加到原数据框 df[[new_col]] <- sum_exp return(df) } # 测试 df1_result_base <- calc_adaptive_sum_base(df1, "eq_df1") df2_result_base <- calc_adaptive_sum_base(df2, "eq_df2")
这个版本通过原生R函数实现,无需额外安装包,同样能自适应任意数量的变量组。
内容的提问来源于stack exchange,提问作者llewmills
相关产品推荐
相关产品推荐

