使用R语言提取数据框字符串中右侧两个点间的数字
解决R语言提取指定子串的问题
你的需求是从df$marker列的字符串里,提取右侧第一个点向左到下一个点之间的内容,比如从MVa.8.199038.R里拿到199038。先说说你原来代码的问题:substr函数需要的是起始和结束的位置数值,你写的\.是正则符号,语法不对,而且固定用nchar(df$marker)-2也不通用,因为不同字符串的目标子串长度不一样。
下面给两种通用的解决方案:
方法1:正则表达式(推荐)
用sub函数匹配目标模式,直接提取需要的部分:
df$extracted <- sub(".*\\.(.*)\\..*", "\\1", df$marker)
- 正则逻辑:
.*\\.匹配字符串开头到倒数第二个点的所有内容;(.*)捕获倒数第二个点和倒数第一个点之间的内容;\\..*匹配倒数第一个点到字符串结尾的内容;最后用\\1替换整个字符串,只保留捕获的目标部分。
方法2:拆分字符串后取值
先按点拆分字符串,再取倒数第二个元素:
df$extracted <- sapply(strsplit(df$marker, "\\."), function(x) x[length(x)-1])
- 逻辑解释:
strsplit(df$marker, "\\.")把每个字符串按点拆分成列表;sapply遍历列表,每个子列表取倒数第二个元素(最右侧点后的内容是倒数第一个元素,往前一位就是我们要的目标)。
这两种方法都能适配不同长度的字符串,满足通用性要求。
内容的提问来源于stack exchange,提问作者Μαρια Πασσαλη
相关产品推荐
相关产品推荐

