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

如何在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语句,步骤如下:

  1. 加载必要的包:
library(dplyr)
  1. 执行批量运算:
# 假设你的数据框是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 LabelsX6X6 20%X6 by 2X7X7 20%X7 by 2
2023-03-011416.87506025
2023-04-011619.28506025

内容的提问来源于stack exchange,提问作者user20203146

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.20 01:47:01