R语言提取data.frame列名数值时代码运行失效问题咨询
问题根因
- 你使用的正则规则
[[:alpha:]]+作用是匹配字符串中的连续英文字母,仅适用于列名包含字母内容的场景,也就是你之前代码正常运行的场景。 - 当前两个数据集的列名均为数值区间格式,仅由数字、括号、逗号构成,不存在任何字母字符,执行匹配后只能得到空结果,无法输出预期内容。
修正代码
如果你的预期是提取所有区间的数值端点,去重后按数值大小排序,将匹配规则替换为匹配连续数字的规则即可,同时增加数值类型转换避免字符排序逻辑错误:
library(magrittr) s_ordered_II <- stringi::stri_extract_all_regex(colnames(dat_II), "\\d+") %>% unlist() %>% as.numeric() %>% unique() %>% sort() s_ordered_I <- stringi::stri_extract_all_regex(colnames(dat_I), "\\d+") %>% unlist() %>% as.numeric() %>% unique() %>% sort()
说明
- 正则
\\d+可以匹配字符串中所有连续数字,不受区间开闭的括号类型((/)/[/])影响,能完整提取每个区间的左右端点数值。 - 提取后必须转换为数值类型再排序:如果保留字符格式排序,会触发字典序错误,比如字符型下
"1000"会排在"25"前面,得到不符合数值大小逻辑的排序结果。 - 运行后
s_ordered_I的输出为0 25 250 500 1000 1500 3000 1000000,s_ordered_II的输出为0 25 50 100 250 500 1000 1500 3000 1000000。
内容的提问来源于stack exchange,提问作者Tom
相关产品推荐
相关产品推荐

