我是不会运行你的代码吗?不,我是不会导入自己的数据!
常常遇到有人問起看到分享的教程導入數據的方式是data(dune)等直接調用系統的數據,而自己怎么讀入自己的數據呢?
對于初學者來講,這確實是個問題。如何準備數據、拿到正確格式的數據并導入后續的代碼進行分析,是學習和應用過程中的第一個攔路虎。
為什么教程會習慣使用內置數據?
簡單省事、便攜可重復;這是內置數據的優勢之一;
內置數據模式清晰,通常可以獲得較好的結果;這是內置數據的優勢之二;
別人用這個,我也用這個,這是一個偷懶的做法。
每個人常識不同。作者可能覺得這個太簡單而忽略了初學者的需求。(生信學習學的是什么?常識!
但內置數據的頻繁使用是導致初學者學習這個教程時經常提出上面這個問題的原因。
我不太贊成教程里面用使用內置數據,原因是:
對不會讀入數據的人不友好;
不利于探索這篇教程用于實際數據時可能會遇到的問題。示例數據無腦運行,自己的數據無顯著差異。
如果要使用內置數據,也需要額外提供一些信息:
詳細描述內置數據的格式和生物含義,及與真實數據的對應,可以參考畫一個帶統計檢驗的PCoA分析結果
提供真實數據的格式示例和讀入真實數據的代碼,彌補這個“鴻溝”;
比如寫這篇文章:你的adonis用對了嗎?不同因素的順序竟然對結果有很大影響
提及可能出現的問題的解決;這也是操作了多套實際數據后,才能寫出的部分。
那假如教程沒有提供這么詳細,自己又得用這個教程,怎么做呢?
自己如何根據教程的數據準備并讀入自己的數據
1. 查看數據的結構,了解數據的構成
既然教程提供了測試數據集,不妨仔細看看測試數據集的特征,沒準就找著規律了。
我們以前面文章提到的dune數據集為例,查看下其結構特征。
行名字是數字,列名字是字符串(如果我們對這些字符串不熟悉,對我們來說就沒任何意義;每個字符都認識,串一起就不知道是啥了~~),中間的值是整數。除此外也看不出其它信息了。
library(vegan) data(dune) head(dune)## Achimill Agrostol Airaprae Alopgeni Anthodor Bellpere Bromhord Chenalbu Cirsarve Comapalu Eleopalu Elymrepe Empenigr ## 1 1 0 0 0 0 0 0 0 0 0 0 4 0 ## 2 3 0 0 2 0 3 4 0 0 0 0 4 0 ## 3 0 4 0 7 0 2 0 0 0 0 0 4 0 ## 4 0 8 0 2 0 2 3 0 2 0 0 4 0 ## 5 2 0 0 0 4 2 2 0 0 0 0 4 0 ## 6 2 0 0 0 3 0 0 0 0 0 0 0 0 ## Hyporadi Juncarti Juncbufo Lolipere Planlanc Poaprat Poatriv Ranuflam Rumeacet Sagiproc Salirepe Scorautu Trifprat Trifrepe ## 1 0 0 0 7 0 4 2 0 0 0 0 0 0 0 ## 2 0 0 0 5 0 4 7 0 0 0 0 5 0 5 ## 3 0 0 0 6 0 5 6 0 0 0 0 2 0 2 ## 4 0 0 0 5 0 4 5 0 0 5 0 2 0 1 ## 5 0 0 0 2 5 2 6 0 5 0 0 3 2 2 ## 6 0 0 0 6 5 3 4 0 6 0 0 3 5 5 ## Vicilath Bracruta Callcusp ## 1 0 0 0 ## 2 0 0 0 ## 3 0 2 0 ## 4 0 2 0 ## 5 0 2 0 ## 6 0 6 02. 查看數據的幫助
從數據結構和行列名字上得不到有用信息,那我們查看下幫助信息。
?dunedune is a data frame of observations of 30 species at 20 sites. The
species names are abbreviated to 4+4 letters (see make.cepnames).
這告訴我們什么呢?這套數據包含了30個物種在20個樣品的豐度信息。從dim(dune)可以看出這是一個20行X30列的矩陣;可以推測出,每一行是一個樣品,每一列是一個物種
(另一個佐證是列名字長度確實為8個字符,與物種名字的4+4縮寫一致)。
注:如果對數據還有疑慮,建議谷歌下數據。常見內置數據集都會有文章描述其信息,可用于佐證你的判斷。
dim(dune)## [1] 20 30這個格式跟我們通常的OTU豐度表
(我們的表通常是每一行是一個物種,每一列是一個樣品)略有不同。
3. 基本判斷后,讀入我們的數據,做可能的轉換
如果我們有一個OTU豐度表,怎么讀入并轉成這個格式呢?
text <- "ID\tSamp1\tSamp2\tSamp3\tSamp4 OTU1\t2\t13\t14\t15 OTU2\t12\t13\t8\t10 OTU3\t22\t10\t14\t11"otu_table <- read.table(text=text, sep="\t", row.names=1, header=T)讀入OTU豐度表,第一行為列名字,第一列為行名字。
otu_table <- read.table("otutable_rare",sep="\t", row.names=1, header=T)根據上面的分析做一個轉置,就可以獲得可用于后續分析的輸入數據了。
otu_table_t <- as.data.frame(t(otu_table)) otu_table_t## OTU1 OTU2 OTU3 ## Samp1 2 12 22 ## Samp2 13 13 10 ## Samp3 14 8 14 ## Samp4 15 10 114. 示例數據中的整數代表什么意思?
這個是比較難確定的部分,只有兩個判斷方法:1)
教程中作者能夠提及(這是最準確的方法);2)憑經驗猜測。
這里涉及到另外一個經常會被問起的問題:
我這一步操作需要提供原始數據,還是標準化之后的數據?
絕大多數情況下,我們需要提供的都是標準化之后的在不同樣品之間可比的數據。因為:1)我們的需求是比較不同樣品的差異,數據需要在樣品間可比;2)絕大部分工具是不會對數據做標準化處理的,要么直接用,要么做一些不影響數值關系的轉換;3)如果某個工具自己內部會對數據做標準化,它一定會在幫助中提及,常見的比如DESeq2,?edgeR、limma,除了這兩個半(limma算半個,因為它也可以接收標準化后的數據),一時想不起還有哪些工具是接受原始數據的。單細胞的Seurat包算是個例外,它內部調用了一些標準化算法,可以通過參數關掉。
5. 查看更多教程,總會遇到有詳細描述所需數據結構的教程。
6. 跟著感覺走,不管三七二十一讀進來試試,出現異常或報錯再調整。學程序不是做實驗,試錯成本沒有那么大,光看不練是假把式,大膽試才是王道。
7. 最后一步,跟教程作者溝通。我們的教程問題,歡迎在http://www.ehbio.com/Esx發帖討論;自己努力后,帶著問題和思路的討論更容易獲得解答。
生物教程還是得使用生物數據!!!
往期精品(點擊圖片直達文字對應教程)
機器學習
后臺回復“生信寶典福利第一波”或點擊閱讀原文獲取教程合集
總結
以上是生活随笔為你收集整理的我是不会运行你的代码吗?不,我是不会导入自己的数据!的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 基于VTK的MFC应用程序开发(1)
- 下一篇: Adobe illustrator 剪切