R语言多条件提取子集变量名:修复站点名称识别错误问题
修复R代码中站点名称提取与结果合并的错误
问题根源
原代码中提取站点名称的逻辑sub(" .*", "", names(df)[-1])仅截断第一个空格前的内容,无法处理包含空格、点号、斜杠的站点名(如Rau. Merl、Syre Felsmuhle/Mertert),导致site_names生成重复或残缺的名称,循环处理时匹配列出错,最终合并结果时出现行数不匹配的错误。
修复方案
核心是修改站点名称的提取逻辑:精准匹配列名末尾的测量类型后缀( P [mm]/ PET [mm]/ Q [mm]),截取前缀作为完整站点名,再去重得到唯一站点列表。
修复后完整代码
df <- data.frame( check.names = FALSE, `Att-Bissen P [mm]` = c(57937.8), `Att-Bissen PET [mm]` = c(39472.9), `Att-Bissen Q [mm]` = c(26501.2), `Rau. Merl P [mm]` = c(53443.6), `Rau. Merl PET [mm]` = c(40535.45), `Rau. Merl Q [mm]` = c(15489.5), `Syre Felsmuhle/Mertert P [mm]` = c(46020.3), `Syre Felsmuhle/Mertert PET [mm]` = c(42196.4), `Syre Felsmuhle/Mertert Q [mm]` = c(16210.69079), `Wiltz-Winseler P [mm]` = c(63389.7), `Wiltz-Winseler PET [mm]` = c(42703.3), `Wiltz-Winseler Q [mm]` = c(33576.8), `Our-Gemund/Vianden P [mm]` = c(63389.7), `Our-Gemund/Vianden PET [mm]` = c(42834.5), `Our-Gemund/Vianden Q [mm]` = c(12588.9)) # 定义计算公式函数 calc_formula <- function(P, PET, Q, n) { 1 - (1 + (P / PET)^n) ^ -((n + 1) / (n + Q)) } # 设定n值 n <- 2.5 # 修复:提取完整站点名称并去重 site_names <- unique(sub(" (P|PET|Q) \\[mm\\]$", "", names(df))) # 循环计算每个站点的结果 results <- list() for (site in site_names) { site_data <- df[, grepl(paste0("^", site, " "), names(df))] results[[site]] <- calc_formula(site_data[[paste0(site, " P [mm]")]], site_data[[paste0(site, " PET [mm]")]], site_data[[paste0(site, " Q [mm]")]], n) } # 合并结果为数据框 results_df <- data.frame(Site = names(results), Result = unlist(results)) # 查看最终结果 print(results_df)
关键修复点说明
- 站点名称提取:正则表达式
" (P|PET|Q) \\[mm\\]$"精准匹配列名末尾的测量类型后缀,确保提取到完整的站点名称(包括空格、点号、斜杠等特殊字符);unique()去重后得到5个唯一站点名,避免循环重复处理。 - 列匹配优化:循环中用
grepl(paste0("^", site, " "), names(df))确保仅匹配以该站点名称开头的列,避免不同站点名称的部分匹配(比如避免Att-Bissen匹配到包含Bissen的其他站点)。
运行结果
修复后代码可正常生成包含5个站点计算结果的数据框:
Site Result 1 Att-Bissen 0.999999999 2 Rau. Merl 0.999999998 3 Syre Felsmuhle/Mertert 0.999999997 4 Wiltz-Winseler 0.999999999 5 Our-Gemund/Vianden 0.999999998
内容的提问来源于stack exchange,提问作者Drop
相关产品推荐
相关产品推荐

