在讀取一行數據之前,應該先考慮下重複數據管理的通用規則,不改寫原始數據。原始文件視為只讀,保留原始文件名字並說明來源,是一個好辦法。
軟體配置幾個包:
install.packages(c("rio","readr","data.table","feather","WDI"))
關於數據I/O的高級技巧R語言自己的文件格式是.Rds,可以使用readRDS()與saveRDS()函數導入與導出,是一種速度與空間存儲都什麼高效的格式。使用rio包的import()能導入各種格式的數據,避免加載特定格式庫的麻煩。對於高效導入大文本文件,使用readr或data.table與read.table()相當。使用file.size()與object.size()跟蹤文件與R對象的大小,以便在過大之前提前預防。使用rio的通用數據導入多功能包,名副其實,提供簡單易用和計算高效的函數,其目標是簡化數據導入導出過程。R的數據導入導出手冊中有些函數已經過時了,比如WriteXLS包,且很難學習。rio包可以處理的格式包含:.csv, .feather, .json, .dta, .xls, .xlsx和谷歌在線表格。其無需指定可選的format參數,另外可以從網絡下載數據。json格式的導入還可以使用jsonlite和和geojasonio包。
library("rio")
x <- import("mtcars.csv")
y <- import("mtcars.rds")
z <- import("mtcars.dta")
export(mtcars, "mtcars.csv")
export(mtcars, "mtcars.rds")
export(mtcars, "mtcars.xls")
純文本格式.csv格式是最常見格式,有三種讀入R的方法:1)基礎R的read.csv(),2)fread() 裡data.table方法3)較新的readr包裡read_csv()函數。雖然有所差異,但是交叉兼容。read.csv()是read.delim()和read.table()的封裝。readstata13包是專門讀取Stata13以上版本的.dta文件而開發的。對於小於1M的數據,read.csv()比read_csv()要快,然而fread()比兩個都快,如果是更大的數據,read_csv()和data.table比read.csv()快5倍左右。
fread()與read_csv()的差異readr與基礎read_()一樣,是基於前1000行而不是所有行來決定每個變量的類。使用readr的話,會將違規數值轉換成NA,而fread()會自動將它認為是數值的列轉化成字符,fread()另一特徵是可以使用列名或索引來設置select參數,從而有選擇的讀取列。總的來說,三者在讀入數據的差異超過了代碼執行的時間,與基礎R相比,其他兩個的速度提升是一定程度的犧牲健壯性為代價的。在基礎R中stringAsFactors=TRUE時才會將字符不轉化為因子,而fread()和read_csv()函數默認返回字符型。read_()生成tbl_df類,而fread()產生data.table()類對象,沒有實際差別,處理稍有不同,除非trbble包被加載。
R外預處理文本讀入一個4G的文本文件,會耗盡16G的內存RAM,可以使用shell命令split等分割文件,採用資料庫是另外一個解決方案。split -b100m bigfile.csv # -b100m意思是分割成100m每個的文件。
二進位文件格式純文本格式有局限性,缺少類型安全,限於表格,限制 了數值精度,以二進位保存,可以減少讀寫時間和文件大小。
R自帶的文件格式:Rds和Rdatasave()為Rdata是應用最廣泛的,函數功能類似save.img()和save.imge()。saveRDS()函數應用相對較少,作者推薦這個,保存R對象更加簡潔,readRDS()更加靈活,結果對象可賦值任何名字。使用這個是個好習慣,強制指定對象名字。
feather文件格式這是為了R語言與Python程式設計師協作而設計的格式,速度快,輕量、保存數據框是與語言無關。
二進位文件的基準測試Rds文件表現最好,磁碟空間僅僅是csv文件的1/4多點,feather格式大約是csv的一半。讀入,比read.csv()快十倍左右,寫feather更快,比write.csv()快十倍,而saveRDS()僅僅快1.2倍。
Protocol Buffers格式谷歌的,RProtoBuf包提供了R接口。
從網際網路獲得數據download.file()函數和zip()可以批量下載和解壓數據。read_csv()也可以直接讀取網址中的數據,但是如果下載失敗需要重複下載。
fileUrl <- "http://www.newcl.org/data/zipfiles/a1.zip"
download.file(fileUrl, destfile = "a1.zip") #下載並保留原始文件名
unzip('a1.zip', exdir="data")
file.remove("1.zip") #移除原文件防止空間浪費rOpenSci是眾多幫助下載和導入數據的包,下面的代碼是通過WDI包(不被rOpenSci支持),訪問世界銀行下載的交通CO2排放的數據:
> library("WDI")
> WDIsearch("CO2")
indicator name
[1,] "EN.ATM.CO2E.CP.KT" "CO2 emissions from cement production (thousand metric tons)"
[2,] "EN.ATM.CO2E.EG.ZS" "CO2 intensity (kg per kg of oil equivalent energy use)"
[3,] "EN.ATM.CO2E.FF.KT" "CO2 emissions from fossil-fuels, total (thousand metric tons)"
[4,] "EN.ATM.CO2E.FF.ZS" "CO2 emissions from fossil-fuels (% of total)"
[5,] "EN.ATM.CO2E.GDP" "CO2 emissions, industrial (kg per 1987 US$ of GDP)"
[6,] "EN.ATM.CO2E.GF.KT" "CO2 emissions from gaseous fuel consumption (kt) "
[7,] "EN.ATM.CO2E.GF.ZS" "CO2 emissions from gaseous fuel consumption (% of total) "
[8,] "EN.ATM.CO2E.GL.KT" "CO2 emissions from gas flaring (thousand metric tons)"
[9,] "EN.ATM.CO2E.KD.87.GD" "CO2 emissions, industrial (kg per 1987 US$ of GDP)"
CO2_transport <- WDI(indicator = "EN.CO2.TRAN.ZS")
> head(CO2_transport)
iso2c country EN.CO2.TRAN.ZS year
1 1A Arab World NA 2020
2 1A Arab World NA 2019
3 1A Arab World NA 2018
4 1A Arab World NA 2017
5 1A Arab World NA 2016
6 1A Arab World NA 2015最好在代碼中對數據來源做些簡單注釋,方便代碼對自己和他人的可用性。與Web頁面交互的兩個包是httr和RCurl包,httr有相對友好的用戶接口(沒有圖形界面的),RCurl是更接近底層。
訪問包中的數據示例數據可以用如下方式查看:data(package="dplyr")
Data sets in package 『dplyr』:
band_instruments Band membership
band_instruments2 Band membership
band_members Band membership
starwars Starwars characters
storms Storm tracks data原始數據通常位於R包的extdata目錄中,system.file()函數輸出具體包的文件路徑:
> list.files(system.file("extdata",package="readr"))
[1] "challenge.csv" "epa78.txt" "example.log" "fwf-sample.txt" "massey-rating.txt"
[6] "mtcars.csv" "mtcars.csv.bz2" "mtcars.csv.zip"可以通過下圖的方式,按tab鍵就可以查看文件夾結構: