You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于列名共性的自适应函数:按组计算指数和

自适应计算指数和的解决方案

下面提供两种自适应的函数实现,无需提前指定变量组名称,自动从数据框列名识别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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.21 11:50:12