基于向量列名使用dplyr批量mutate生成多列乘积
用dplyr批量生成列乘积的解决方案
刚好遇到过类似的需求,不用重复写mutate语句的关键是利用**符号(symbol)和非标准求值(NSE)**来批量生成表达式,结合purrr的迭代工具就能轻松搞定。下面是完整的可复现代码和步骤:
首先,我们先构造示例数据和定义要配对的列名向量:
library(dplyr) library(purrr) # 构造模拟的银行数据集 bankdata <- tibble( cash = c(100, 200, 300), loans = c(50, 60, 70), deposits = c(150, 250, 350), assets = c(200, 300, 400), reserves = c(20, 30, 40), liabilities = c(180, 270, 360) ) # 定义要相乘的列名对:var1的每个元素对应var2的同位置元素 var1 <- c("cash", "deposits", "reserves") var2 <- c("loans", "assets", "liabilities") # 定义结果列的名称(比如result1、result2...) result_cols <- paste0("result", seq_along(var1))
接下来是核心步骤:批量生成乘积表达式,一次性传入mutate:
# 生成每一对列的乘积表达式(把字符串列名转为可识别的符号) product_exprs <- map2(var1, var2, ~ sym(.x) * sym(.y)) # 给每个表达式命名为对应的结果列名 names(product_exprs) <- result_cols # 批量新增列到原数据集 bankdata <- bankdata %>% mutate(!!!product_exprs)
代码解释
sym():把字符串格式的列名转换为dplyr能识别的符号对象,这样才能在mutate里直接引用列。map2():遍历var1和var2的每一对元素,生成列1 * 列2的表达式,最终得到一个表达式列表。!!!:这是dplyr里的非拼接运算符,把列表里的所有表达式拆解开,作为mutate的多个参数,相当于手动写了mutate(result1 = cash*loans, result2 = deposits*assets, ...)。
运行完后,查看数据集就能看到新增的3个结果列:
> bankdata # A tibble: 3 × 9 cash loans deposits assets reserves liabilities result1 result2 result3 <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> 1 100 50 150 200 20 180 5000 30000 3600 2 200 60 250 300 30 270 12000 75000 8100 3 300 70 350 400 40 360 21000 140000 14400
这种方法的好处是可扩展性极强——不管你需要生成10个还是100个乘积列,只要调整var1和var2的内容,代码不需要做任何修改。
内容的提问来源于stack exchange,提问作者Marco
相关产品推荐
相关产品推荐

