以fasta为例,刷一波R语言小技巧
今天是生信星球陪你的第439天
大神一句话,菜鸟跑半年。我不是大神,但我可以缩短你走弯路的半年~
就像歌儿唱的那样,如果你不知道该往哪儿走,就留在这学点生信好不好~
这里有豆豆和花花的学习历程,从新手到进阶,生信路上有你有我!
本来只是想展示一下apply结合自定义函数的应用,结果越写越多,跑题了。不过,小技巧还是很好玩的,值得一学~今天雨特别大,开车门时发生了剐蹭,蹭的还是个宝马。豆豆先生开始办去澳门的各种手续,老板三个月前发给我的奖金(现金)也终于存进了银行。。。混乱的一天。
1.生成一组示例序列
先生成一条序列,并且把生成序列的代码写成个函数,函数的输入数据是序列的长度:
x= c("A","T","C","G")
ms <-function(n){
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 <- paste0(">",x1,"n",y)
res
#> [1] ">seq1nGACCGCCTTATAGCAGTTAGTGTAG"
#> [2] ">seq2nGGAAGCGTCATTCGAACTATGCCGG"
#> [3] ">seq3nAACAGTTCCGTCCACTTGGCCATTG"
#> [4] ">seq4nTACCGCCTTTGTTAGCCGTGTGGCT"
#> [5] ">seq5nATCTCCAGACTTTATAAATCTATCA"
#> [6] ">seq6nGTGTGGTATTATCGTGATCTCCACG"
#> [7] ">seq7nGAGCACAGACGCGCTAGAGAATTGA"
#> [8] ">seq8nGTTTTACACGCATCAGTGGGTAAAG"
#> [9] ">seq9nTGGCAGTGTCTCTCTAGCGTGATCT"
#> [10] ">seq10nAGGCCATGGGTTGGGAGTTACTTAT"
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 <- data.frame(V1=paste0("seq",1:10),V2=y)
res2 = apply(df,1,function(x){
paste0(">",x[1],"n",x[2])
})
res2
#> [1] ">seq1nGACCGCCTTATAGCAGTTAGTGTAG"
#> [2] ">seq2nGGAAGCGTCATTCGAACTATGCCGG"
#> [3] ">seq3nAACAGTTCCGTCCACTTGGCCATTG"
#> [4] ">seq4nTACCGCCTTTGTTAGCCGTGTGGCT"
#> [5] ">seq5nATCTCCAGACTTTATAAATCTATCA"
#> [6] ">seq6nGTGTGGTATTATCGTGATCTCCACG"
#> [7] ">seq7nGAGCACAGACGCGCTAGAGAATTGA"
#> [8] ">seq8nGTTTTACACGCATCAGTGGGTAAAG"
#> [9] ">seq9nTGGCAGTGTCTCTCTAGCGTGATCT"
#> [10] ">seq10nAGGCCATGGGTTGGGAGTTACTTAT"
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] ">seq1nCCTGTCTAGTCCGAGATATGGTAAGn>seq2nATGTGAAGGAACACGCATGAAAAAGn>seq3nAGGGCTATCCGGGGAAGAAATTAGCn>seq4nACGCTATATCGCAGCATGTCTCTAGn>seq5nATCAGCCACGTCACAACGGTGGCATn>seq6nACTACTACTGCTAAAGTAGGCTGCTn>seq7nGGTTCCATTGTATGACATAACAAACn>seq8nTGACAGAACGAAGTCATGATACCGAn>seq9nATTTGCCTGTGTCCTCGAGAGTAGTn>seq10nCTCTCAGCGACGGGCGGTGAAAGCT"
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电脑上的默认打开方式而已。
向大家隆重推荐隔壁生信技能树的一系列干货!
点击底部的“阅读原文”,获得更好的阅读体验哦😻
初学生信,很荣幸带你迈出第一步。
我们是生信星球,一个不拽术语、通俗易懂的生信知识平台。由于是2018年新号,竟然没有留言功能。需要帮助或提出意见请后台留言、联系微信或发送邮件到jieandze1314@gmail.com,每一条都会看到的哦~
请关注“恒诺新知”微信公众号,感谢“R语言“,”数据那些事儿“,”老俊俊的生信笔记“,”冷🈚️思“,“珞珈R”,“生信星球”的支持!