如何在R中为数据框多列批量执行动态数学运算?
R中批量为多列执行动态数学运算
我需要在R中为数据框的每一列动态执行多种数学运算,比如给原值增长20%、原值除以2,同时保留原列。如果手动写mutate语句,少量列还行,但如果有100列要执行2-5种运算,重复写mutate太繁琐,有没有更高效的方法?
我使用的数据框如下:
structure(list(`Row Labels` = c("2023-03-01", "2023-04-01", "2023-05-01", "2023-06-01", "2023-07-01", "2023-08-01", "2023-09-01", "2023-10-01"), X6 = c(14, 16, 14, 11, 9, 9, 11, 11), X7 = c(50, 50, 50, 50, 50, 50, 50, 50), X8 = c(75, 75, 75, 75, 75, 75, 75, 75), X9 = c(100, 100, 100, 100, 100, 100, 100, 100), X11 = c(25, 25, 50, 75, 125, 200, 325, 525), X12 = c(50, 50, 100, 150, 250, 400, 650, 1050)), class = c("tbl_df", "tbl", "data.frame"), row.names = c(NA, -8L))
原来处理单列的代码是这样的:
library(readxl) library(dplyr) Book1 <- read_excel("C:/X/X/X- X/X/Book1.xlsx",sheet = "Sheet6") dput(Book1) Book1 <- Book1 %>% mutate(`X6 20%` = X6*1.20) %>% mutate(`X6 by 2`= X6/2)
我试过用循环,但列名指定总是出问题,有没有简单的实现方式?
解决方案:使用dplyr的
across()函数 用dplyr的across()可以一次性对多列执行多种运算,无需重复写mutate语句,步骤如下:
- 加载必要的包:
library(dplyr)
- 执行批量运算:
# 假设你的数据框是Book1 Book1_processed <- Book1 %>% mutate(across( # 选择要处理的列:排除Row Labels,处理所有数值列 cols = !matches("Row Labels"), # 定义需要执行的运算,每个元素对应一种操作 .fns = list( `20%` = ~ .x * 1.2, `by 2` = ~ .x / 2 ), # 设置新列名格式:原列名 + 运算名称,和你手动定义的格式一致 .names = "{col} {fn}" ))
代码解释:
cols = !matches("Row Labels"):筛选出除Row Labels外的所有列,精准定位需要处理的数值列.fns = list(...):用列表包裹所有要执行的运算,~ .x代表当前循环到的列的数值.names = "{col} {fn}":自定义新列命名规则,最终生成X6 20%、X6 by 2这类符合需求的列名
结果示例:
处理后的数据集会保留所有原列,同时新增对应运算的结果列,部分结构如下:
| Row Labels | X6 | X6 20% | X6 by 2 | X7 | X7 20% | X7 by 2 |
|---|---|---|---|---|---|---|
| 2023-03-01 | 14 | 16.8 | 7 | 50 | 60 | 25 |
| 2023-04-01 | 16 | 19.2 | 8 | 50 | 60 | 25 |
内容的提问来源于stack exchange,提问作者user20203146
相关产品推荐
相关产品推荐

