如何使用R、stingr拆分字符串

如何使用R、stingr拆分字符串,r,regex,R,Regex,我想将以下格式拆分为四列 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

我想将以下格式拆分为四列

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。

不确定R是否是一种语言,但使用regex,您可以:

chr(\d):[a-z]\.(\d{8})([A-Z])>([A-Z])
$1$2$3$4
将包含您想要的内容

在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是否是一种语言,但使用正则表达式,您可以:

chr(\d):[a-z]\.(\d{8})([A-Z])>([A-Z])
$1$2$3$4
将包含您想要的内容

在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”

使用base 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"
  )

text使用base 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"
  )


strsplit(gsub(“chr | g\\”,“”,xzx),“[:>]”)的文本可能的重复项
在样本完全具有代表性的情况下起作用。@r2evans它似乎不会分隔数字后面的字符。第一行89G。正确,不完美……你在问题中要求3栏,但在你想要的答案中似乎用了4栏。请澄清。
strsplit(gsub(“chr | g\\.,”,xzx),“[:>]”)的可能重复项如果示例完全具有代表性,则可以使用。@r2evans它似乎不会将数字后面的字符分隔开。第一行89G。正确,不完美……你在问题中要求3栏,但在你想要的答案中似乎用了4栏。请澄清。(R需要双反斜杠,所以我添加了它们。)在R:
regmatches(x,gregexpr(“chr(\\d):[a-z]\.(\\d{8})([a-z])>([a-z])>,xzx)中不起作用。
,但我怀疑这是一个好的开始。@r2evans我认为,如果我简单地发布原始regex,OP可以找出它们自己的转义序列。查看我的regex101示例。@r2evans一点也不,事实上我很感激:)@r2evans我重新阅读了OP的帖子,他们要求提供三列,但他们想要的输出显示了四列。不太确定他们的澄清是否会改变我的正则表达式和/或你添加的片段。看起来您使用的是捕获组,因此将
$3$4
合并为一个组将非常简单。对于不一致性,非常抱歉。是,输出中需要4列,如图所示。我还意识到数值可以灵活使用,因此建议使用
\\d+
而不是
\d{8}
。多亏了这个链接,我还学到了更多的正则表达式!(R需要双反斜杠,所以我添加了它们。)在R:
regmatches(x,gregexpr(“chr(\\d):[a-z]\.(\\d{8})([a-z])>([a-z])”,xzx)中不起作用。
,但我怀疑这是一个好的开始。@r2evans我发现,如果我简单地发布原始regex,OP可以找出它们自己的转义序列。查看我的regex101示例。@r2evans一点也不,事实上我很感激:)@r2evans我重新阅读了OP的帖子,他们要求提供三列,但他们想要的输出显示了四列。不太确定他们的澄清是否会改变我的正则表达式和/或你添加的片段。看起来您使用的是捕获组,因此将
$3$4
合并为一个组将非常简单。对于不一致性,非常抱歉。是,输出中需要4列,如图所示。我还意识到数值可以灵活使用,因此建议使用
\\d+
而不是
\d{8}
。多亏了这个链接,我还学到了更多的正则表达式!我相信OP希望最后两个字母分开?太好了!在R中输出为一个很好的数据帧。选择这个作为答案,因为它提供了一个我可以使用的df。我相信OP希望最后两个字母分开?太好了!在R中输出为一个很好的数据帧。选择这个作为答案,因为它提供了一个我可以使用的df。