如何自动化处理名称以相同数字开头的列对运算?
自动化处理同数字前缀列的除法运算
示例数据集
(注:原数据集中存在重复列名的笔误,已修正为合理列名)
ff <- data.frame( `210.sum` = c(10, 20, 30, 40), `210.pred.sum` = c(4, 3, 2, 1), `220.sum` = c(1, .9, .75, .7), `220.pred.sum` = c(10, 50, 30, 20), `180.sum` = c(1, 2, 3, 4), `180.pred.sum` = c(.5, .5, .9, .9), params = c(100, 50, 40, 30), params.l = c(2, 1, 4, 3), check.names = FALSE )
需求说明
需要对每组以相同数字开头的列对(xxx.sum 和 xxx.pred.sum)执行除法运算,生成对应的 xxx.prcnt 列。但列对数量、数字前缀都可能变化,无法手动逐个编写代码,需自动化实现。
自动化实现方法
方法一:用tidyr重塑数据后计算(结构清晰,适合多列关联处理)
利用pivot_longer把同前缀的列合并到同一行,计算后再转回宽格式:
library(tidyverse) ff.2 <- ff %>% # 提取目标列转成长格式,拆分前缀和后缀 pivot_longer( cols = matches("^\\d+\\.(sum|pred\\.sum)$"), names_to = c("prefix", ".value"), names_pattern = "(\\d+)\\.(.*)" ) %>% # 计算百分比列 mutate(prcnt = sum / pred.sum) %>% # 转回宽格式,保留原非目标列 pivot_wider( id_cols = c(params, params.l), names_from = prefix, values_from = c(sum, pred.sum, prcnt), names_glue = "{prefix}.{.value}" )
方法二:用dplyr直接批量新增列(简洁高效,仅新增目标列)
先提取所有唯一的数字前缀,再批量生成计算列:
library(dplyr) library(stringr) # 提取所有带.sum后缀的列的数字前缀 prefixes <- ff %>% select(matches("^\\d+\\.sum$")) %>% colnames() %>% str_extract("^\\d+") # 批量生成prcnt列 ff.2 <- ff %>% mutate( across( all_of(prefixes), ~ .data[[str_c(.x, ".sum")]] / .data[[str_c(.x, ".pred.sum")]], .names = "{.col}.prcnt" ) )
内容的提问来源于stack exchange,提问作者GrBa
相关产品推荐
相关产品推荐

