在R中实现两组选定数据框列两两相乘并新增所有乘积列的方法
R数据框两组列两两相乘生成新列的实现方法
你尝试的写法不符合dplyr的语法规则:mutate中的:仅用于列范围选择,无法直接实现两组列的两两相乘运算,因此会报错。
下面提供两种通用实现方案,可适配任意长度的两组列组合:
方案1:tidyverse生态实现(代码简洁易读)
依赖dplyr和purrr包,是目前R数据处理的主流写法:
# 加载依赖包 library(tidyverse) # 示例数据构造 df <- as.data.frame(matrix(rep(1:6, 3), nrow = 3, dimnames = list(NULL, letters[1:6]))) # 定义需要两两相乘的两组列 group1 <- c("a", "b", "c") group2 <- c("d", "e", "f") # 生成所有两两组合的乘积列,合并到原数据 df_final <- df %>% bind_cols( # 生成列名的所有两两组合 cross2(group1, group2) %>% map_dfc(~ { # 定义新列名 new_col <- paste(.x[[1]], .x[[2]], sep = "*") # 计算乘积 tibble(!!sym(new_col) := df[[.x[[1]]]] * df[[.x[[2]]]]) }) )
运行后df_final就是包含所有乘积列的目标结果。
方案2:Base R实现(无需加载第三方包)
如果不希望依赖额外包,可以用基础R语法实现:
# 示例数据构造 df <- as.data.frame(matrix(rep(1:6, 3), nrow = 3, dimnames = list(NULL, letters[1:6]))) # 定义需要两两相乘的两组列 group1 <- c("a", "b", "c") group2 <- c("d", "e", "f") # 生成所有列组合 col_combs <- expand.grid(group1, group2, stringsAsFactors = FALSE) # 遍历组合生成乘积列 for (i in seq(nrow(col_combs))) { col_name <- paste(col_combs[i, 1], col_combs[i, 2], sep = "*") df[[col_name]] <- df[[col_combs[i, 1]]] * df[[col_combs[i, 2]]] }
运行后直接在原数据框df中新增所有需要的乘积列。
通用性说明
两种方案都可以通过修改group1和group2的列名向量,适配任意数量的两组列组合,无需手动调整后续运算逻辑。
内容的提问来源于stack exchange,提问作者Pål Bjartan
相关产品推荐
相关产品推荐

