友情提示:藍色下劃線字體為引文,請保持警惕!
使用R語言讀取 Affymetrix Human Exon 1.0 ST Array 晶片平臺探針注釋文件:
https://www.affymetrix.com/analysis/downloads/na36/wtexon/HuEx-1_0-st-v2.na36.hg19.probeset.csv.zip
解壓後的.csv文件有950MB+,部分內容如下:
其中,前22行為"#"開頭的注釋行,所以可以不讀入。本文將以該文件為例,介紹三種讀取方法,並測評讀取速度上的優劣!
1、utils包中的 read.csv 函數,打開R即可直接使用,所以不需要另外安裝加載R包:
data = read.csv("HuEx-1_0-st-v2.na36.hg19.probeset.csv", header = T, comment.char = "#")
2、data.table包中的 fread 函數,需要安裝加載data.table包,由於沒有 read.csv 函數中類似 comment.char = "#"的參數設置,故需要通過skip跳過一定數量的行:
p_load(data.table)
data = as.data.frame(fread("HuEx-1_0-st-v2.na36.hg19.probeset.csv", skip = 22, header = T, sep = ",", fill = T))
該函數有個明顯的缺點,就是本例中"#"的行,無法很方便的通過其他參數識別並丟棄,參考:
https://github.com/Rdatatable/data.table/issues/856
Even though fread(cmd='grep -v "#" table.csv') works fine in general, it's not cross platform compatible and makes your code a bit harder to read.
3、readr包中的 read_csv 函數,需要安裝加載readr包,這個包在我們的歷史文章中數次出現,包括在GEOquery包中的重要作用、將數據高效輸出到文件中、以及 將數據追加輸出到表格文件。與前兩種函數的區別在於參數名,col_names = T等同於header = T,如下:
p_load(readr)
data = as.data.frame(read_csv("HuEx-1_0-st-v2.na36.hg19.probeset.csv", comment = "#", col_names = T))
4、比較。三種函數都可以讀取.csv格式文件,但 read.csv 函數在讀取大文件時過於緩慢,我們使用microbenchmark包測試多次執行的情況下,三種函數讀取本例文件的用時( system.time函數只能計算單次,所以結果會不穩健,可能存在一定的偏倚):
microbenchmark is based on repeated iterations. system.time is the time for a single runHere we』ll need to use microbenchmark() instead of system.time() in order to get enough accuracy to see a difference
p_load(microbenchmark)
datafile = "HuEx-1_0-st-v2.na36.hg19.probeset.csv"
benchmark = microbenchmark(
read.csv = read.csv(datafile, header = T, comment.char = "#", stringsAsFactors = F),
fread = as.data.frame(fread(datafile, skip = 22, header = T, sep = ",", fill = T)), # nThread=getDTthreads(),即使用所有能用的核心
read_csv = as.data.frame(read_csv(datafile, comment = "#", col_names = T)), times = 10) # 10次執行
print(benchmark, signif = 2)
結果如下:
測試了10次執行, fread的速度是最快的,讀取950Mb+的.csv文件平均只需要5.1秒, read_csv 需要11秒,而 read.csv 函數則需要36秒,故在執行速度上的順序是 fread > read_csv > read.csv。
fread 的高效性來源之一是支持多線程:
參數nThread: The number of threads to use. Experiment to see what works best for your data on your hardware.
對統計結果做個可視化:
ggplot2::autoplot(benchmark)
小提琴圖的橫坐標為時間,數據分布在左側表示用該方法用時短,右側表示讀取用時較長。
綜上:對於較大的.csv文件的讀取,推薦使用 fread 和 read_csv 函數!
而對於.xlsx或.xls文件,推薦使用readxl包中的 read_excel 函數進行讀取!
友情提示:本文涉及的R包安裝詳見下示!