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电脑上的默认打开方式而已。
閱讀更多 生信星球 的文章