如何在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
相关产品推荐
相关产品推荐

