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

如何在R中对名称相似的多列批量使用mutate进行运算?

批量计算各学科及格学生人数

可以通过正则匹配列名结合dplyr的across和str_replace实现批量操作,具体代码如下:

library(tidyverse)

test <- tibble(id = c(1:4),
               n_sci = c(10, 20, 30, 40),
               score_sci = c(1, .9, .75, .7),
               loc_sci = c(1, 2, 3, 4),
               n_math = c(100, 50, 40, 30),
               score_math = c(.5, .6, .7, .8),
               loc_math = c(4, 3, 2, 1),
               n_hist = c(10, 50, 30, 20),
               score_hist = c(.5, .5, .9, .9),
               loc_hist = c(2, 1, 4, 3))

# 批量生成及格人数列
test <- test %>%
  mutate(across(starts_with("n_"), 
                ~ .x * get(str_replace(cur_column(), "n_", "score_")),
                .names = "{col}_success"))

代码说明:

  • starts_with("n_"):精准匹配所有以n_开头的列(各学科总人数列)
  • str_replace(cur_column(), "n_", "score_"):把当前处理的列名(如n_sci)替换为对应的score_前缀列名(如score_sci),再用get()获取该列的数值
  • .names = "{col}_success":定义新列命名规则,在原n_列名后追加_success,比如n_sci生成n_sci_success

执行后,数据集会自动新增n_sci_success、n_math_success、n_hist_success三列,分别对应各学科的及格学生人数。

扩展:更精准的正则匹配方案

如果列名规则有变动,可通过正则捕获组锁定学科名称,适配更复杂的命名场景:

test <- test %>%
  mutate(across(matches("^n_\\w+"), 
                ~ .x * get(str_replace(cur_column(), "^n_(\\w+)$", "score_\\1")),
                .names = "{col}_success"))

这里^n_\\w+匹配以n_开头、后续为字母/数字的列,str_replace通过捕获组提取学科名称,再替换为对应的score_列。

内容的提问来源于stack exchange,提问作者J.Sabree

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.01 13:17:32