熱線電話:13121318867

登錄
首頁大數據時代手把手教你用R語言讀取CSV文件
手把手教你用R語言讀取CSV文件
2020-08-24
收藏

作者:Jared P. Lander

來源:大數據DT(ID:hzdashuju)

編自:《R語言:實用數據分析和可視化技術》(原書第2版)

讀取CSV文件最好的方法是使用read.table函數,許多人喜歡使用read.csv函數,該函數其實是封裝的read.table函數,同時設置read.table函數的sep參數為逗號(",")。read.table函數返回的結果為data.frame。

read.table函數的第一個參數為文件所在路徑,可以是本地文件,也可以是網頁上的文件。本書主要是從網頁讀取文件。

任意CSV文件都可以讀取,這里使用read.table函數讀取一個簡單的文件(地址如下):

http://www.jaredlander.com/data/TomatoFirst.csv

> theUrl <-"http://www.jaredlander.com/data/TomatoFirst.csv"
> tomato <-read.table(file=theUrl, header=TRUE, sep=",")

利用head命令,我們可以看到下面的結果。

> head(tomato)

如前面所述,第一個參數是文件名(或字符型變量)。注意我們如何顯式地使用參數名file、head和sep。函數的參數能夠按位置順序賦值,而不用顯式指定參數名,但指定參數名是最佳實踐。

第二個參數header,表示數據的第一行,即列名。第三個參數sed,表示數據的分隔符??梢栽O為“\t”(tab分隔符)或者“;”(分號分隔符),以讀取不同類型的文件。

常用但不被熟知的參數是stringAsFactors。將該參數設為FALSE(默認是TRUE)可使字符所在列不被轉換成factor列。這樣既節省計算時間(當大數據集包含許多字符列,也意味著有許多唯一值),又能保留列為字符。

stringAsFactors參數也可以用在data.frame中。再次創建“Sport”列。

> x <- 10:1
> y <- -4:5
> q <- c("Hockey", "Football", "Baseball", "Curling", "Rugby",
+        "Lacrosse", "Basketball", "Tennis", "Cricket", "Soccer")
> theDF <-data.frame(First=x, Second=y, Sport=q, stringsAsFac=FALSE)
> theDF$Sport

read.table函數還有許多參數,最常用的是quote和colClasses參數,分別設置字符的包圍符和每列的數據類型。

類似read.csv函數,也有其他用于read.table的封裝函數,也有默認參數。它們主要的區別是sep和dec參數。詳細情況見表6-1。

▲表6-1 讀取大文本文件的函數及其默認參數

大文件使用read.table函數讀取到內存比較慢,幸運的是有解決方案。讀取大CSV文件和其他文本文件的兩個主流的函數是read_delim和fread,前者在readr包中由Hadley Wickham實現,后者在data.table包中由Matt Dowle實現。read_delim和fread運行相當快,因為兩者都不把字符數據自動轉換成factor。

01、 read_delim函數

readr包提供讀取文本文件的一系列函數。最常用的是read_delim函數,讀取有分隔符的文件,比如CSV文件。該函數的第一個參數是讀取的文件路徑或者URL。col_names默認為TRUE,指定文件的第一行為列名。

> library(readr)
> theUrl <- "http://www.jaredlander.com/data/TomatoFirst.csv"
> tomato2 <- read_delim(file=theUrl, delim=',')
Parsed with column specification:
  cols(
    Round = col_integer(),
    Tomato = col_character(),
    Price = col_double(),
    Source = col_character(),
    Sweet = col_double(),
    Acid = col_double(),
    Color = col_double(),
    Texture = col_double(),
    Overall = col_double(),
    `Avg of Totals` = col_double(),
    `Total of Avg` = col_double()
  )

read_delim函數執行后會打印列名和數據類型信息,這些信息也可以使用head.read_delim函數獲得。

readr包中的所有數據提取函數返回的是tibble,該數據類型是data.frame的擴展。最明顯的變化是打印的元數據,比如行列數和每列的數據類型。tibble會適應屏幕大小打印相應條數的行列數據。

> tomato2

read_delim函數不僅僅讀取速度比read.table函數快,而且不需要設置stringAsFactors參數為FALSE。read_csv、read_csv2和read_tsv函數是read.table函數分隔符分別為逗號(,)、分號(;)和tab(\t)的特殊情況。

注意,數據讀取為tbl_df對象,它是tbl的擴展,也是data.frame的擴展。tbl是data.frame的特殊類型,它在dplyr包中定義。每列的數據類型顯示在列名的下面,這是個很好的功能。

readr包有一些對read_delim函數封裝(預置分隔符)的輔助函數,比如read_csv函數和read_tsv函數。

02 、fread函數

另一個讀取大量數據的函數是data.table包的fread函數。第一個參數是讀取的文件路徑或者URL。header參數表示文件的第一行是列名,sep指定分隔符。該函數的stringAsFactors參數默認設為FALSE。

> library(data.table)
> theUrl <- "http://www.jaredlander.com/data/TomatoFirst.csv"
> tomato3 <- fread(input=theUrl, sep=',', header=TRUE)

這里也可以使用head函數查看前幾行數據:

> head(tomato3)

該函數讀取速度比read.table函數快,結果為data.table對象。data.table對象是data.frame的擴展,其是data.frame的優化。

read_delim或者fread函數讀取文件都非???,具體使用哪個函數取決于dplyr或者data.table包中哪個更適合數據處理。

關于作者:賈里德 P. 蘭德(Jared P. Lander),資深數據專家,Lander Analytics公司創始人兼CEO,紐約開放統計編程聚會負責人,哥倫比亞大學統計學兼職教授。在數據管理、多層次模型、機器學習、廣義線性模型、可視化、數據管理和統計計算等多個領域擁有豐富經驗。

數據分析咨詢請掃描二維碼

若不方便掃碼,搜微信號:CDAshujufenxi

數據分析師資訊
更多

OK
客服在線
立即咨詢
日韩人妻系列无码专区视频,先锋高清无码,无码免费视欧非,国精产品一区一区三区无码
客服在線
立即咨詢