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

如何在R中基于列名模式批量执行条件数学运算

批量生成晶圆差值列的解决方案

问题背景

现有如下格式的DataFrame(示例):

TS                          Wafer(1)Radius(06)      Wafer(2)Radius(06)   Wafer(3)Radius(06)             Wafer(1)_max            Wafer(2)_max            Wafer(3)_max            Wafer(1)_min                Wafer(2)_min                    Wafer(3)_min
2022-06-29T02:54:33.537582      698.827305          699.153166              701.153731                  699.17035               699.183843              701.545892              698.572553                  698.678988                      699.444565
2022-06-29T02:54:40.987582      696.241402          696.336327              700.313207                  696.241402              696.411087              700.435095              695.253749                  695.655695                      696.047009
2022-06-29T02:54:48.429972      691.987146          691.803447              697.176958                  691.987146              691.803447              697.187276              690.879083                  690.706554                      690.284588
2022-06-29T02:54:55.877582      686.561008          686.295043              692.386884                  686.561008              686.295043              692.386884              684.639355                  684.388604                      684.443958
2022-06-29T02:55:03.327582      680.716974          680.377037              686.803004                  680.716974              680.377037              686.803004              678.071563                  677.826257                      677.984677
2022-06-29T02:55:10.777582      674.501714          674.25299               680.702401                  674.501714              674.25299               680.702401              672.066944                  671.429438                      671.354129

需要为每个晶圆生成两类差值列:

  • Wafer(n)_max-Wafer(n)Radius(06):对应晶圆的max列减去Radius(06)列
  • Wafer(n)Radius(06)-Wafer(n)_min:对应晶圆的Radius(06)列减去min列

实际数据集包含50个晶圆与10-15个半径参数,需通过正则模式匹配实现批量处理。

生成示例数据集的代码:

df <- data.frame( TS = c("2022-06-29T02:54:33.537582","2022-06-29T02:54:40.987582","2022-06-29T02:54:48.429972","2022-06-29T02:54:55.877582","2022-06-29T02:55:03.327582","2022-06-29T02:55:10.777582"),
                  `Wafer(1)Radius(06)` = c(698.827305,696.241402,691.987146,686.561008,680.716974,674.501714),
                  `Wafer(2)Radius(06)` = c(699.153166,696.336327,691.803447,686.295043,680.377037,674.25299),
                  `Wafer(3)Radius(06)` = c(701.153731,700.313207,697.176958,692.386884,686.803004,680.702401),
                  `Wafer(1)_max` = c(699.17035,696.241402,691.987146,686.561008,680.716974,674.501714),
                  `Wafer(2)_max` = c(699.183843,696.411087,691.803447,686.295043,680.377037,674.25299),
                  `Wafer(3)_max` = c(701.545892,700.435095,697.187276,692.386884,686.803004,680.702401),
                  `Wafer(1)_min` = c(698.572553,695.253749,690.879083,684.639355,678.071563,672.066944),
                  `Wafer(2)_min` = c(698.678988,695.655695,690.706554,684.388604,677.826257,671.429438),
                  `Wafer(3)_min` = c(699.444565,696.047009,690.284588,684.443958,677.984677,671.354129))

解决方案

方法一:保留原始列名,正则提取晶圆编号

使用stringr包的正则匹配功能提取晶圆编号,循环批量生成计算列:

library(stringr)

# 提取所有唯一的晶圆编号(从列名中匹配Wafer(n)里的数字)
wafer_nums <- unique(str_extract(names(df), "(?<=Wafer\\()\\d+(?=\\))"))

# 遍历每个晶圆编号,生成两类差值列
for(num in wafer_nums) {
  # 定位对应列的名称
  radius_col <- paste0("Wafer(", num, ")Radius(06)")
  max_col <- paste0("Wafer(", num, ")_max")
  min_col <- paste0("Wafer(", num, ")_min")
  
  # 计算并添加max - radius列
  df[[paste0("Wafer(", num, ")_max-Wafer(", num, ")Radius(06)")]] <- df[[max_col]] - df[[radius_col]]
  
  # 计算并添加radius - min列
  df[[paste0("Wafer(", num, ")Radius(06)-Wafer(", num, ")_min")]] <- df[[radius_col]] - df[[min_col]]
}

方法二:移除列名括号,简化匹配

如果允许修改原始列名,可以先移除所有括号,让列名更简洁,匹配逻辑更直观:

library(stringr)

# 移除列名中的所有括号
names(df) <- str_remove_all(names(df), "\\(|\\)")

# 提取晶圆编号
wafer_nums <- unique(str_extract(names(df), "(?<=Wafer)\\d+"))

# 批量生成计算列
for(num in wafer_nums) {
  radius_col <- paste0("Wafer", num, "Radius06")
  max_col <- paste0("Wafer", num, "_max")
  min_col <- paste0("Wafer", num, "_min")
  
  df[[paste0("Wafer", num, "_max-Wafer", num, "Radius06")]] <- df[[max_col]] - df[[radius_col]]
  df[[paste0("Wafer", num, "Radius06-Wafer", num, "_min")]] <- df[[radius_col]] - df[[min_col]]
}

说明

两种方法都能自动适配任意数量的晶圆,无需手动逐个编写计算逻辑。方法一保留原始列名格式,方法二通过简化列名降低正则复杂度,可根据实际需求选择。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.19 07:01:18