如何从包含文本与数字的data frame列中提取纯数字内容
问题原因
你之前使用的substr(OLD$CHR, 4, 4)仅会提取字符串第4位的单个字符,遇到Chr14、Chr19这类数字长度≥2的取值时,只能提取到数字的第一位,因此无法得到预期结果。
正确实现方案
下面提供3种通用的实现方式,都可以满足需求:
方案1:base R正则替换(无需额外安装包,通用性最强)
用gsub删除所有非数字字符后转为整数即可:New$CHR_1 <- as.integer(gsub("\\D", "", OLD$CHR))其中
\\D是正则语法,匹配所有非数字字符,替换为空后剩余内容就是你需要的纯数字。方案2:固定前缀截取(适合所有值都是
Chr开头的场景)
把substr的结束位置设置为字符串总长度,就可以完整提取前缀后的所有内容:New$CHR_1 <- as.integer(substr(OLD$CHR, 4, nchar(OLD$CHR)))方案3:tidyverse生态写法(适合已经在使用tidyverse系列包的场景)
用stringr的str_extract直接提取连续数字:library(stringr) New$CHR_1 <- str_extract(OLD$CHR, "\\d+") %>% as.integer()
以上三种方案对你给出的示例值Chr1、Chr14、Chr19、Chr2、Chr8、Chr7,都可以输出预期的1、14、19、2、8、7结果。
内容的提问来源于stack exchange,提问作者Mahan
相关产品推荐
相关产品推荐

