基于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
相关产品推荐
相关产品推荐

