我想使用R和sub提取符号周围的字符。 我尝试了许多正则表达式,但我没有得到我想要的东西。
我的载体:
c("G>GA", "T>A", "G>A", "G>A", "A>T", "CT>C", "T>C", "T>C", "A>T", "T>C", "T>A", "A>G", "CCGCCGCGGCCGCCGTCTTCCACCAACAACATGGCGGA>C", "C>T", "T>A", "T>C", "T>G", "G>C", "T>G", "T>A", "G>A")
>
之前和之后我只需要一个角色。
我最好的尝试是:
sub("(.*?)>", ">", aa, perl = TRUE)
答案 0 :(得分:9)
您需要在正则表达式中使用捕获组:
vec <- c("G>GA", "T>A", "G>A", "G>A", "A>T", "CT>C", "T>C", "T>C", "A>T", "T>C", "T>A", "A>G", "CCGCCGCGGCCGCCGTCTTCCACCAACAACATGGCGGA>C", "C>T", "T>A", "T>C", "T>G", "G>C", "T>G", "T>A", "G>A")
> sub(".*(.)>(.).*","\\1\\2",vec)
[1] "GG" "TA" "GA" "GA" "AT" "TC" "TC" "TC" "AT" "TC" "TA" "AG" "AC" "CT" "TA"
[16] "TC" "TG" "GC" "TG" "TA" "GA"
在单词中,正则表达式匹配任何零次或多次.*
的内容,然后捕获下一个字符(.)
,然后匹配大于号>
,然后捕获下一个字符(.)
和然后在末尾.*
匹配任何零次或多次。将所有这些替换为两个捕获的字符\\1\\2
。
答案 1 :(得分:5)
提供可重复的示例
> x = c("A>G", "AT>GC")
找到您感兴趣的符号的索引(使用fixed=TRUE
,因为您实际上并未查找正则表达式。)
> i = regexpr(">", x, fixed=TRUE)
然后提取前一个和/或后一个字符
> substr(x, i-1, i-1)
[1] "A" "T"
> substr(x, i+1, i+1)
[1] "G" "G"
或获取序列
> substr(x, i-1, i+1)
[1] "A>G" "T>G"
也许你可重复的例子包括边缘情况
> x = c("A>G", "AT>GC", "", ">G", "A>", ">", NA)
然后需要更多处理?
答案 2 :(得分:0)
看起来您正在尝试获取参考和替代等位基因?只查找一个字符表明您只对SNP感兴趣?您可以使用strsplit生成ref和alt等位基因的数据框。
test <- c("G>GA", "T>A", "G>A", "G>A", "A>T", "CT>C", "T>C", "T>C", "A>T", "T>C", "T>A", "A>G", "CCGCCGCGGCCGCCGTCTTCCACCAACAACATGGCGGA>C", "C>T", "T>A", "T>C", "T>G", "G>C", "T>G", "T>A", "G>A")
Alleles <- data.frame(t(data.frame(sapply(test, function(x) strsplit(x,split=">")))),row.names=NULL,stringsAsFactors=F)
colnames(Alleles) <- c("Ref","Alt")
Alleles$bases <- apply(Alleles,1,function(x) sum(length(unlist(strsplit(x[1],split=""))),length(unlist(strsplit(x[2],split="")))))
SNPs <- Alleles[Alleles$bases == 2,]
只需在替换(&gt;)的任一侧取一个碱基就会给你错误的遗传信息。变体“CCGCCGCGGCCGCCGTCTTCCACCAACAACATGGCGGA&gt; C”将减少为“A> C” - 它看起来像一个简单的SNP,但与最后38个碱基“CGCCGCGGCCGCCGTCTTCCACCAACAACATGGCGGA&gt; - ”的删除相同。
这是你追求的吗?