上期我們瞭解了R語言數據讀入的核心函數read.table,現在我們瞭解一下其他可以用的函數有哪些,以及使用的場景和基本技巧。
非關係結構文件讀入scan()
除了read.table()這類讀取文本文檔的函數,還可以用scan()函數讀入。不同的是它的返回值為列表或者向量。
假設我們有下述文本文檔
24 | 1991 |
21 | 1993 |
53 | 1962 |
下列命令可以讀入該數據
data<-scan("e:/birth.txt")data
## [1] 24 1991 21 1993 53 1962
此外,你代碼稍加改造可以將數據變矩陣。
matrix(data,nrow=2,byrow=FALSE)
## [,1] [,2] [,3]
scan()也同樣支持訪問url數據上的數據,現在我們訪問網上的一個age數據
data <- scan("https://s3.amazonaws.com/assets.datacamp.com/blog_assets/age.csv", what = list(Age = 0,
## $Age
注意上述代碼中的what參數,如果what為list類通過上述代碼可以讀入類似於spreadsheet類型的文本文檔。只需要定義每行中各個項目(列)的類型。scan()其他眾多參數的用法和read.table比較類似。
固定列寬數據讀入read.fwf()
有的時候我們可以知道每一列的寬度是多少,下列代碼可以讓我們讀入這類數據
data <- read.fwf("https://s3.amazonaws.com/assets.datacamp.com/blog_assets/scores.txt", widths= c(7,-14,1,-2,1,1,1,1,1,1),
## subject sex s1 s2 s3 s4 s5 s6
上述代碼中width參數給出了字段的寬度。本例中,前7個字符為課程名字;然後的14個字符我們認為不需要,用-14跳過;接著,性別這一列需要一個寬度的字符;後面的2個空格不需要,用-2跳過;後續的成績每列需要一個寬度1,1,1,1,1,1傳入參數中。這些參數在不同的數據結構下,會有所不同。
另外,還可以使用read.fortran()函數讀取數據,詳細方法可以參見help文檔理解。
導入excel數據
剪切板導入excel表格
如果你已經有了個打開的表格,你可以複製其中的內容,然後用readClipboard()或者read.table()函數導入數據。
readClipboard() #Only on Windows
RODBC包讀入excel數據
通過RODBC包同樣可以導入excel數據表。代碼樣例如下
library(RODBC)
其中,dsn的寫法可以參考odbcConnect()函數的幫助文檔。此外,odbcConnectExcel()同樣可以讀入excel數據。
當你讀入了Excel數據表後,相當於建立了一個連接,你可以使用sql語句來操作數據
query <- "<SQL Query>"
用RODBC包的建立了連接後,在操作完數據要使用odbcCloseAll()
其他方法讀入excel數據
其他可以參考的方法有: * openxlsx包中的read.xlsx函數。 * readxl包中的read_excel函數。
其他類型的數據讀入
其他主流數據類型R可支持的包括有JSON格式,SPSS文件,Stata文件,SAS文件,s-plus文件,EpiInfo文件,matlab文件,Octave文件,FitbitScraper 數據,Quantmod 數據,ARFF 文件。 支持導入的數據庫有,MogoDB,MySQL,Oracle,PostgreSQL,SQLite,RJDBC,dBase等。
二進制數據讀入
二進制數據由二進制浮點組成,8個浮點為一個字節。可以使用readBin函數讀入此類數據。
connection <- file("<path to your file>", "rb") #You open the connection as "reading binary"(rb)
GIS數據讀入
地理信息數據在R中也比較常用,常見的rgdal和raster包都有對應的函數處理此類數據。
大型數據集的讀入
如何導入較大的數據一直是R用戶的經常討論的問題,除了將數據導入數據庫中處理外,也有一些比較不錯的處理大型數據的方法。
data.table包中的fread函數是比較容易實現快速讀入大數據的方法,讀入大型數據速度相當理想。
library(data.table)
ff包:該程序包磁盤緩存的技術可以讀入超過內存限值大小的數據,常用的函數有read.table.ffdf(),read.csv.ffdf()等。
library(ff)
bigmemory包,此包也常用於處理大型數據。樣例代碼如下,但是此包不能用於windows系統:
library(bigmemory)
sqldf包,此包也可以考慮用於處理大型數據,它還可以使用sql語句處理數據。用read.csv.sql()函數讀入數據。
library(sqldf)
隨後我們別忘了R中的read.table函數,但是,用此函數讀入大型數據,需要對參數有較好的控制。簡單說,你能設置的參數越多,讀入數據的速度越快。
總結
最後,我們將上述常見的方法做個了總結表格,讀者可在用時參考,該表格涵蓋了大部分常用數據格式的讀入方法。
函數 | 來源 | 描述 |
---|---|---|
scan | r-base | 順序讀取文件中的數據值 |
read.fwf | r-base | 按行和指定列寬度讀取數據 |
read.fortran | r-base | 採用fortran格式設置讀取固定格式數據 |
readClipboard | r-base | 讀取剪切板中的數據 |
odbcConnect | RODBC包 | 讀取excel數據,採用odbc |
gs_read | googlesheet包 | 讀取google sheet |
read.DIF | r-base | 讀取DIF文件 |
read_excel | readxl包 | 讀取excel文件 |
read.xlsx | openxlsx包 | 讀取excel的xlsx文件 |
read.ods | readODS包 | 讀取open document表格文檔 |
fromJSON | jsonlite包 | 讀取JavaScript的json文件 |
read_spss | haven包 | 讀取spss文件 |
read_dta | haven包 | 讀取stata文件 |
read.xport | forgein包,sasXPORT包 | 讀取sas文件 |
read.S | foreign包 | 讀取s-splus文件 |
read.epiinfo | foreign包 | 讀取epi Info文件 |
readMat | R.matlab包 | 讀取MATLAB文件 |
read.octave | foreign包 | 讀取Octave文件 |
read.arff | foreign包 | 讀取Weka屬性關係文件(ARFF) |
… | mongolite包,Rmongo包,RODBC包,Roracle包,RPostgreSQL包,RSQLite包,RJDBC包 | 各類常見數據庫導入數據到R |
readBin | r-base | 讀入二進制文件 |
… | hdf5包,h5r包,rhdf5包,RNetCDF包,ncdf包 | 讀入hdf文件,NASA和UCAR常用氣象數據讀取 |
read.dbf | foreign包 | 讀入DBF文件 |
read.ftable | r-base | 讀入無格式列聯表Flat contingency table |
fread | data.table包 | 大型文本文檔讀入 |
read.table.ffdf read.csv.ffdf … | ff包 | 大型文本文檔讀入 |
read.big.matrix | bigmemory包 | 大型文本文檔讀入,無法在windows下使用 |
read.csv.sql | sqldf包 | 大型文本文檔讀入 |
read.table | r-base | 大型文本文檔讀入,但是需要合理設計參數,否則速度不理想 |
來源:DataCamp 編譯:亮亮