R语言优化嵌套ifelse批量生成后测场景名称列的实现方法
优化实现代码
你可以直接用dplyr的行操作+across批量处理,完全不需要堆叠多层ifelse,代码可读性和扩展性都更强:
首选tidyverse简洁解法
library(dplyr) library(stringr) data_desired <- data_current %>% rowwise() %>% mutate( # 批量匹配所有配对编号列进行处理 across(matches("^Posttest\\.Scenario\\.\\d+\\.Pair$"), # 用配对编号作为索引,取当前行对应分组的场景名 ~ c_across(matches("^Posttest\\.Pair\\.\\d+\\.Scenario$"))[.x], # 自动生成指定格式的新列名 .names = "Posttest.Scenario.{str_extract(.col, '\\\\d+')}") )
如果需要新列名用空格分隔(和你原代码的Posttest Scenario x格式一致),把.names参数的值改为"Posttest Scenario {str_extract(.col, '\\\\d+')}"即可。
逻辑说明
- 沿用你原有的行运算逻辑,不需要调整数据结构
- 用正则匹配自动识别所有配对编号列和场景名列,不需要手动写1-5的列名,后续如果增加场景组数不需要改核心逻辑
- 直接用配对编号作为索引取对应位置的场景名,逻辑比多层
ifelse清晰很多
如果你偏好base R循环实现
for (i in 1:5) { pair_val <- data_current[[paste0("Posttest.Scenario.", i, ".Pair")]] data_current[[paste0("Posttest.Scenario.", i)]] <- sapply(seq_along(pair_val), function(r) { data_current[r, paste0("Posttest.Pair.", pair_val[r], ".Scenario")] }) }
内容的提问来源于stack exchange,提问作者vuca438
相关产品推荐
相关产品推荐

