我是初学者。
我有"cCt/cGt"我想把C和G提取出来写成C>G
test ="cCt/cGt"
str_extract(test, "[A-Z]+$")
试试这个:
gsub(".*([A-Z]).*([A-Z]).*", "\1>\2", test )
[1] "C>G"
在这里,我们在括号(...)
中给出的捕获组中捕获大写字母的两次出现。这使得可以引用在gsub
的替换子句中使用反向引用\1
和\2
来替换它们(并且只替换它们,而不替换字符串的其余部分!)在替换子句中,我们还包括所需的>
。
您似乎在两个连接的字符串中寻找突变,这个函数应该可以解决您的问题:
extract_mutation <- function(text){
splitted <- strsplit(text, split = "/")[[1]]
pos <- regexpr("[[:upper:]]", splitted)
uppercases <- regmatches(splitted, pos)
mutation <- paste0(uppercases, collapse = ">")
return(mutation)
}
如果两个基本交换总是在相同的索引,如果你感兴趣,你也可以返回位置:
position <- pos[1]
return(list(mutation, position))
代替return(mutation)
还可以捕获后面和前面的两个大写字符,然后是可选的小写字符和中间的/
。
test ="cCt/cGt"
res = str_match(test, "([A-Z])[a-z]*/[a-z]*([A-Z])")
sprintf("%s>%s", res[2], res[3])
输出[1] "C>G"
查看R演示。
整个字符串的精确匹配可以是:
^[a-z]([A-Z])[a-z]/[a-z]([A-Z])[a-z]$