R语言拆分区间格式字符串为数值的正则问题求助
解决方案:拆分区间字符串为上下限数值
你的问题出在sub的使用逻辑上——你以为它会提取捕获组的内容,但实际上sub只是替换匹配到的部分,剩下的非数字字符会残留,导致转成数值时出现NA。比如处理"[0.15,0.273]"时,原正则替换后得到的是"0.150.273]",这显然不是纯数字,自然转不成数值。
下面给你三种可行的解决方法:
方法一:修正sub的正则(无需额外包)
调整正则,让它匹配整个字符串,把整个内容替换成捕获到的数字部分:
test_bins <- c("[0.15,0.273]", "(0.273,0.397]", "(0.397,0.52]", "[0.52,0.643]") lower_values <- as.numeric(sub("^[\\(\\[]([0-9.]+),.*$", "\\1", test_bins)) upper_values <- as.numeric(sub("^.*,([0-9.]+)[\\)\\]]$", "\\1", test_bins)) data.frame(test_bins, lower_values, upper_values)
运行后输出:
test_bins lower_values upper_values 1 [0.15,0.273] 0.150 0.273 2 (0.273,0.397] 0.273 0.397 3 (0.397,0.52] 0.397 0.520 4 [0.52,0.643] 0.520 0.643
方法二:用stringr包提取捕获组(更直观)
stringr的str_match可以直接提取正则捕获组的内容,不需要替换整个字符串:
library(stringr) lower_values <- as.numeric(str_match(test_bins, "^[\\(\\[]([0-9.]+),")[, 2]) upper_values <- as.numeric(str_match(test_bins, ",([0-9.]+)[\\)\\]]$")[, 2]) data.frame(test_bins, lower_values, upper_values)
方法三:用tidyr拆分数据框(最适合管道操作)
如果是在dplyr管道里处理数据框,用separate一步拆分,再清理符号,代码更简洁:
library(dplyr) library(tidyr) # 模拟你的数据框 test_df <- tibble(bin = c("[0.15,0.273]", "(0.273,0.397]", NA, "(0.397,0.52]", "[0.52,0.643]")) test_df %>% filter(!is.na(bin)) %>% separate(bin, into = c("lower", "upper"), sep = ",", remove = FALSE) %>% mutate( lower = as.numeric(str_remove_all(lower, "^[\\(\\[]")), upper = as.numeric(str_remove_all(upper, "[\\)\\]]$")) )
输出结果会保留原bin列,同时生成正确的lower和upper数值列。
内容的提问来源于stack exchange,提问作者Megan S
相关产品推荐
相关产品推荐

