【问题标题】:Extract the character around a symbol in R提取R中符号周围的字符
【发布时间】:2014-02-01 10:49:44
【问题描述】:

我想使用 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)

【问题讨论】:

  • 你能dput你的向量吗?
  • 我最好的尝试是 sub("(.*?)>", ">", aa, perl = TRUE)
  • 我的向量: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”)

标签: regex string r genetics


【解决方案1】:

您需要在正则表达式中使用捕获组:

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"

换句话说,正则表达式匹配任何零次或多次 .* 然后捕获下一个字符 (.) 然后匹配大于号 &gt; 然后捕获下一个字符 (.) 然后匹配任何零次或多次结束.*。将所有这些替换为两个捕获的字符\\1\\2

【讨论】:

  • @user3186183 哦,我误解了你想要什么。那么这就足够了:sub(".*(.&gt;.).*","\\1",vec).
  • 可能会将. 缩小到[A-Z],因为所有字符串都只使用大写字母。
  • @tenub 好吧,[ACGT] 是基因数据。
【解决方案2】:

提供一个可重现的例子

> 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)

然后需要更多处理?

【讨论】:

    【解决方案3】:

    您似乎正在尝试获取参考和替代等位基因?只寻找一个字符表明您只对 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,]
    

    仅在替换 (>) 的任一侧取一个碱基会为您提供错误的遗传信息。变体“CCGCCGCGGCCGCCGTCTTCCACCAACAACATGGCGGA>C”将简化为“A>C”——它看起来像一个简单的 SNP,但与删除最后 38 个碱基“CGCCGCGGCCGCCGTCTTCCACCAACAACATGGCGGA>-”相同。

    这就是你想要的吗?

    【讨论】:

      猜你喜欢
      • 2020-04-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-05-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多