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

如何自动化处理名称以相同数字开头的列对运算?

自动化处理同数字前缀列的除法运算

示例数据集

(注:原数据集中存在重复列名的笔误,已修正为合理列名)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.08 22:33:31