今天是生信星球陪你的第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"
如果你有真實的序列,直接用()讀進來,as.()變成字符串就好。
2.把序列成fasta格式
最簡單的fasta格式是第一行大于號加序列名稱,第二行是序列。
把字符串序列變成fasta格式,可以這樣
方法一
x1?=?paste0("seq",1:10)
res?<-?paste0(">",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
知識點三:
可以將字符串中的特殊符號"\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]?">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配上自定義函數,可以做很多事情。
判斷兩個變量是否完全相等,用(),不用 ==
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電腦上的默認打開方式而已。
向大家隆重推薦隔壁生信技能樹的一系列干貨!
、