常常遇到有人問起看到分享的教程導入數據的方式是data(dune)等直接調用系統(tǒng)的數據,而自己怎么讀入自己的數據呢?
對于初學者來講,這確實是個問題。如何準備數據、拿到正確格式的數據并導入后續(xù)的代碼進行分析,是學習和應用過程中的第一個攔路虎。
為什么教程會習慣使用內置數據?
但內置數據的頻繁使用是導致初學者學習這個教程時經常提出上面這個問題的原因。
我不太贊成教程里面用使用內置數據,原因是:
如果要使用內置數據,也需要額外提供一些信息:
那假如教程沒有提供這么詳細,自己又得用這個教程,怎么做呢?
自己如何根據教程的數據準備并讀入自己的數據
1. 查看數據的結構,了解數據的構成
既然教程提供了測試數據集,不妨仔細看看測試數據集的特征,沒準就找著規(guī)律了。
我們以前面文章提到的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 0
2. 查看數據的幫助
從數據結構和行列名字上得不到有用信息,那我們查看下幫助信息。
?dune
dune is a data frame of observations of 30 species at 20 sites. Thespecies 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 <- "IDSamp1Samp2Samp3Samp4OTU12131415OTU21213810OTU322101411"otu_table <- read.table(text=text, sep="", row.names=1, header=T)
讀入OTU豐度表,第一行為列名字,第一列為行名字。
otu_table <- read.table("otutable_rare",sep="", row.names=1, header=T)
根據上面的分析做一個轉置,就可以獲得可用于后續(xù)分析的輸入數據了。
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 11
4. 示例數據中的整數代表什么意思?
這個是比較難確定的部分,只有兩個判斷方法:1)教程中作者能夠提及(這是最準確的方法);2)憑經驗猜測。
這里涉及到另外一個經常會被問起的問題:
我這一步操作需要提供原始數據,還是標準化之后的數據?
絕大多數情況下,我們需要提供的都是標準化之后的在不同樣品之間可比的數據。因為:1)我們的需求是比較不同樣品的差異,數據需要在樣品間可比;2)絕大部分工具是不會對數據做標準化處理的,要么直接用,要么做一些不影響數值關系的轉換;3)如果某個工具自己內部會對數據做標準化,它一定會在幫助中提及,常見的比如DESeq2, edgeR、limma,除了這兩個半(limma算半個,因為它也可以接收標準化后的數據),一時想不起還有哪些工具是接受原始數據的。單細胞的Seurat包算是個例外,它內部調用了一些標準化算法,可以通過參數關掉。
5. 查看更多教程,總會遇到有詳細描述所需數據結構的教程。
6. 跟著感覺走,不管三七二十一讀進來試試,出現異?;驁箦e再調整。學程序不是做實驗,試錯成本沒有那么大,光看不練是假把式,大膽試才是王道。
7. 最后一步,跟教程作者溝通。我們的教程問題,歡迎在http://www.ehbio.com/Esx發(fā)帖討論;自己努力后,帶著問題和思路的討論更容易獲得解答。