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

