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

基于tidyverse实现数据框同后缀列组合乘积生成新数据框的方法

解决方案

基于tidyverse生态的dplyr、purrr组件实现,全程无显式循环,向量化计算效率更高,扩展性好。


完整可运行代码

# 加载依赖包
library(tidyverse)
library(lubridate)

# 构造示例数据(和你提供的一致)
a1 <- rnorm(n = 10)
b1 <- rnorm(n = 10)
c1 <- rnorm(n = 10)
a2 <- rnorm(n = 10)
b2 <- rnorm(n = 10)
c2 <- rnorm(n = 10)

Original <- data.frame(
  date = seq(today()-9, today(), by = 1),
  a1 = a1,
  b1 = b1,
  c1 = c1,
  a2 = a2,
  b2 = b2,
  c2 = c2
)

# 核心处理逻辑
Objective <- Original %>%
  # 保留date列作为基础表
  select(date) %>%
  # 批量绑定两组乘积列
  bind_cols(
    # 遍历后缀1、2两个分组,新增分组只需修改此处向量即可
    map(c("1", "2"), function(suffix) {
      # 提取当前分组的所有列名
      cols <- str_subset(names(Original), paste0(suffix, "$"))
      # 生成两两不重复列组合,避免重复计算
      combn(cols, 2, function(col_pair) {
        # 计算两列乘积
        prod_val <- Original[[col_pair[1]]] * Original[[col_pair[2]]]
        # 拼接列名:如果需要和你示例的列名顺序一致(如b1a1而非a1b1),把col_pair改为rev(col_pair)即可
        set_names(list(prod_val), paste0(col_pair, collapse = ""))
      }, simplify = FALSE) %>%
      bind_cols()
    })
  )

逻辑说明

  • 自动按列名后缀拆分计算分组,无需手动指定列名,后续新增后缀分组只需修改map函数的输入向量即可
  • 用combn生成不重复的两两列组合,不会出现a1*b1和b1*a1的重复计算
  • 全流程向量化操作,相比手写循环性能更高,代码简洁易维护

内容的提问来源于stack exchange,提问作者Ian.T

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.18 04:45:04