如何使用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。