【问题标题】:How to split the string using R, stingr如何使用 R、stingr 分割字符串
【发布时间】:2019-07-30 19:09:23
【问题描述】:

我想把下面的格式分成四列

chr6:g.32218989G>A
chr6:g.32409530G>A
chr6:g.33042880A>G
chr6:g.32590925G>A
chr6:g.31006855T>C
chr6:g.31093587G>A

要求的格式是:

    6   32218989    G   A
    6   32409530    G   A
    6   33042880    A   G
    6   32590925    G   A
    6   31006855    T   C
    6   31093587    G   A      `    

我试过了 str_remove(xzx, c("chr", "g.")) 但卡住了。请注意,两个数字列都是 n 位,对于 col1 不一定是 n=1,对于 col2 不一定是 n=8。

【问题讨论】:

  • strsplit(gsub("chr|g\\.", "", xzx), "[:>]") 在样本完全具有代表性的情况下有效。
  • @r2evans 似乎没有将数字后面的字符分开。例如。 89G 在第一行。
  • 真实,不完美......
  • 您在问题中请求了 3 列,但似乎在您想要的输出中使用了 4。请澄清。

标签: r regex


【解决方案1】:

不确定 R 作为一种语言,但使用正则表达式可以:

chr(\d):[a-z]\.(\d{8})([A-Z])>([A-Z])

$1$2$3$4 将包含您想要的内容。

见https://regex101.com/r/mf0y7e/1

在 R 中工作:

gsub("chr(\\d):[a-z]\\.(\\d{8})([A-Z])>([A-Z])", "\\1:\\2:\\3:\\4", xzx)
# [1] "6:32218989:G:A" "6:32409530:G:A" "6:33042880:A:G" "6:32590925:G:A" "6:31006855:T:C" "6:31093587:G:A"
strsplit(gsub("chr(\\d):[a-z]\\.(\\d{8})([A-Z])>([A-Z])", "\\1:\\2:\\3:\\4", xzx), ":")
# [[1]]
# [1] "6"        "32218989" "G"        "A"       
# [[2]]
# [1] "6"        "32409530" "G"        "A"       
# [[3]]
# [1] "6"        "33042880" "A"        "G"       
# [[4]]
# [1] "6"        "32590925" "G"        "A"       
# [[5]]
# [1] "6"        "31006855" "T"        "C"       
# [[6]]
# [1] "6"        "31093587" "G"        "A"       

【讨论】:

  • (R 需要双反斜杠,所以我添加了它们。)在 R 中不起作用:regmatches(x, gregexpr("chr(\\d):[a-z]\\.(\\d{8})([A-Z])>([A-Z])", xzx)),但我怀疑这是一个好的开始。
  • @r2evans 我认为如果我简单地发布原始正则表达式,OP 可以找出他们自己的转义序列。查看我的 regex101 示例。
  • @r2evans 一点也不,其实很感激 :)
  • @r2evans 我重新阅读了 OP 的帖子,他们要求提供三列,但他们想要的输出显示 4 列。不太确定他们的澄清是否会改变我的正则表达式和/或您添加的部分。看起来您使用了捕获组,因此将$3$4 连接成一个很简单。
  • 很抱歉出现不一致。是的,需要如图所示的输出中的 4 列。我也意识到数值可以是灵活的,所以建议\\d+ 而不是\d{8}。感谢链接,我还学到了更多的正则表达式!
【解决方案2】:

使用基础 R,一种方法是使用 gsub 提取您想要的每个单独的片段。希望这可以帮助!

data.frame(col1 = gsub("chr(\\d+).*", "\\1", text),
           col2 = gsub(".*:g\\.(\\d+).*", "\\1", text),
           col3 = gsub(".*([A-Z])>[A-Z]", "\\1", text),
           col4 = gsub(".*>([A-Z])", "\\1", text),
           stringsAsFactors = F)

  col1     col2 col3 col4
1    6 32218989    G    A
2    6 32409530    G    A
3    6 33042880    A    G
4    6 32590925    G    A
5    6 31006855    T    C
6    6 31093587    G    A

数据:

text <- c(
  "chr6:g.32218989G>A",
  "chr6:g.32409530G>A",
  "chr6:g.33042880A>G",
  "chr6:g.32590925G>A",
  "chr6:g.31006855T>C",
  "chr6:g.31093587G>A"
  )

【讨论】:

  • 我相信 OP 希望最后两个字母分开?
  • 完美!在 R 中也输出为一个不错的数据框。选择这个作为答案,因为它提供了一个我可以使用的 df。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-06-12
  • 1970-01-01
  • 2011-03-26
  • 1970-01-01
相关资源
最近更新 更多