以fasta为例,刷一波R语言小技巧

1.生成一组示例序列

先生成一条序列,并且把生成序列的代码写成个函数,函数的输入数据是序列的长度:

x= c("A","T","C","G")
ms paste(sample(x,n,replace = TRUE),collapse = "")
}
ms(25)
#> [1] "AAAGGTAGGTGTTGTAGAACTATGT"

然后生成一组示例数据,例子是10个序列,每个长度25:

知识点一:用sample和paste0生成随机字符串

paste0和sample都是基础函数,但是用处很大,sample表示抽样,加上replace = TRUE就是有放回的抽样,paste0则表示将结果无缝连接起来,这不就成了个序列嘛~

知识点二

用数据结构(例如向量/列表)储存for循环多次产生的结果,这些结果成为向量/列表里的元素。

y = c()
for(i in 1:10){
y[[i]] = ms(25)
}
y
#> [1] "GACCGCCTTATAGCAGTTAGTGTAG" "GGAAGCGTCATTCGAACTATGCCGG"
#> [3] "AACAGTTCCGTCCACTTGGCCATTG" "TACCGCCTTTGTTAGCCGTGTGGCT"
#> [5] "ATCTCCAGACTTTATAAATCTATCA" "GTGTGGTATTATCGTGATCTCCACG"
#> [7] "GAGCACAGACGCGCTAGAGAATTGA" "GTTTTACACGCATCAGTGGGTAAAG"

#> [9] "TGGCAGTGTCTCTCTAGCGTGATCT" "AGGCCATGGGTTGGGAGTTACTTAT"

如果你有真实的序列,直接用readLines()读进来,as.character()变成字符串就好。

2.把序列成fasta格式

最简单的fasta格式是第一行大于号加序列名称,第二行是序列。

把字符串序列变成fasta格式,可以这样

方法一

x1 = paste0("seq",1:10)
res ",x1,"\\n",y)
res
#> [1] ">seq1\\nGACCGCCTTATAGCAGTTAGTGTAG"
#> [2] ">seq2\\nGGAAGCGTCATTCGAACTATGCCGG"
#> [3] ">seq3\\nAACAGTTCCGTCCACTTGGCCATTG"
#> [4] ">seq4\\nTACCGCCTTTGTTAGCCGTGTGGCT"
#> [5] ">seq5\\nATCTCCAGACTTTATAAATCTATCA"
#> [6] ">seq6\\nGTGTGGTATTATCGTGATCTCCACG"
#> [7] ">seq7\\nGAGCACAGACGCGCTAGAGAATTGA"
#> [8] ">seq8\\nGTTTTACACGCATCAGTGGGTAAAG"
#> [9] ">seq9\\nTGGCAGTGTCTCTCTAGCGTGATCT"
#> [10] ">seq10\\nAGGCCATGGGTTGGGAGTTACTTAT"
writeLines(res)
#> >seq1
#> GACCGCCTTATAGCAGTTAGTGTAG
#> >seq2
#> GGAAGCGTCATTCGAACTATGCCGG
#> >seq3
#> AACAGTTCCGTCCACTTGGCCATTG
#> >seq4
#> TACCGCCTTTGTTAGCCGTGTGGCT

#> >seq5
#> ATCTCCAGACTTTATAAATCTATCA
#> >seq6
#> GTGTGGTATTATCGTGATCTCCACG
#> >seq7
#> GAGCACAGACGCGCTAGAGAATTGA
#> >seq8
#> GTTTTACACGCATCAGTGGGTAAAG
#> >seq9
#> TGGCAGTGTCTCTCTAGCGTGATCT
#> >seq10
#> AGGCCATGGGTTGGGAGTTACTTAT

知识点三

writeLines可以将字符串中的特殊符号"\\n","\\t"等显示出来成为它本来的样子。

方法二

(其实写这一篇只是为了举个例子说说apply(),结果跑偏了。)

df res2 = apply(df,1,function(x){
paste0(">",x[1],"\\n",x[2])
})
res2
#> [1] ">seq1\\nGACCGCCTTATAGCAGTTAGTGTAG"
#> [2] ">seq2\\nGGAAGCGTCATTCGAACTATGCCGG"
#> [3] ">seq3\\nAACAGTTCCGTCCACTTGGCCATTG"
#> [4] ">seq4\\nTACCGCCTTTGTTAGCCGTGTGGCT"
#> [5] ">seq5\\nATCTCCAGACTTTATAAATCTATCA"
#> [6] ">seq6\\nGTGTGGTATTATCGTGATCTCCACG"
#> [7] ">seq7\\nGAGCACAGACGCGCTAGAGAATTGA"
#> [8] ">seq8\\nGTTTTACACGCATCAGTGGGTAAAG"
#> [9] ">seq9\\nTGGCAGTGTCTCTCTAGCGTGATCT"
#> [10] ">seq10\\nAGGCCATGGGTTGGGAGTTACTTAT"

writeLines(res2)
#> >seq1
#> GACCGCCTTATAGCAGTTAGTGTAG
#> >seq2
#> GGAAGCGTCATTCGAACTATGCCGG
#> >seq3
#> AACAGTTCCGTCCACTTGGCCATTG
#> >seq4
#> TACCGCCTTTGTTAGCCGTGTGGCT
#> >seq5
#> ATCTCCAGACTTTATAAATCTATCA
#> >seq6
#> GTGTGGTATTATCGTGATCTCCACG
#> >seq7
#> GAGCACAGACGCGCTAGAGAATTGA
#> >seq8
#> GTTTTACACGCATCAGTGGGTAAAG
#> >seq9
#> TGGCAGTGTCTCTCTAGCGTGATCT
#> >seq10
#> AGGCCATGGGTTGGGAGTTACTTAT
identical(res,res2)
#> [1] TRUE

知识点四

apply(X, MARGIN, FUN, …)其中X是数据框/矩阵名;MARGIN为1表示取行,为2表示取列,FUN是函数。强大的apply配上自定义函数,可以做很多事情。

判断两个变量是否完全相等,用identical(),不用 ==

3.后续

可以合并

如果你需要合成一整个字符串,那也简单。

resl=paste(res,collapse = "\\n")
resl
# [1] ">seq1\\nCCTGTCTAGTCCGAGATATGGTAAG\\n>seq2\\nATGTGAAGGAACACGCATGAAAAAG\\n>seq3\\nAGGGCTATCCGGGGAAGAAATTAGC\\n>seq4\\nACGCTATATCGCAGCATGTCTCTAG\\n>seq5\\nATCAGCCACGTCACAACGGTGGCAT\\n>seq6\\nACTACTACTGCTAAAGTAGGCTGCT\\n>seq7\\nGGTTCCATTGTATGACATAACAAAC\\n>seq8\\nTGACAGAACGAAGTCATGATACCGA\\n>seq9\\nATTTGCCTGTGTCCTCGAGAGTAGT\\n>seq10\\nCTCTCAGCGACGGGCGGTGAAAGCT"
writeLines(resl)
#> >seq1
#> GACCGCCTTATAGCAGTTAGTGTAG
#> >seq2
#> GGAAGCGTCATTCGAACTATGCCGG
#> >seq3
#> AACAGTTCCGTCCACTTGGCCATTG
#> >seq4
#> TACCGCCTTTGTTAGCCGTGTGGCT
#> >seq5
#> ATCTCCAGACTTTATAAATCTATCA
#> >seq6
#> GTGTGGTATTATCGTGATCTCCACG
#> >seq7
#> GAGCACAGACGCGCTAGAGAATTGA
#> >seq8
#> GTTTTACACGCATCAGTGGGTAAAG
#> >seq9
#> TGGCAGTGTCTCTCTAGCGTGATCT
#> >seq10
#> AGGCCATGGGTTGGGAGTTACTTAT

还可以导出

write.table(resl,
file = "test.fasta",
row.names = F,
quote = F)

知识点五

字符串也可以导出的。想要让导出的文件没引号,就加quote = F,导出文件后缀可以改,改成fasta没关系的,因为是纯文本,后缀不改变本质,只是决定了这文件在window电脑上的默认打开方式而已。


分享到:


相關文章: