導入CSV、TXT文件
read.table函數:read.table函數以數據框的格式讀入數據,所以適合讀取混合模式的數據,但是要求每列的數據數據類型相同。
read.table讀取數據非常方便,通常只需要文件路徑、URL或連接對象就可以了,也接受非常豐富的參數設置:
- file參數:這是必須的,可以是相對路徑或者絕對路徑(注意:Windows下路徑要用斜杠'/'或者雙反斜杠'\\')。
- header參數:默認為FALSE即數據框的列名為V1,V2...,設置為TRUE時第一行作為列名。
data1<-read.table('item.csv')#默認header=FALSE data2<-read.table('item.csv',header=TRUE)
- sep參數:分隔符,默認為空格。可以設置為逗號(comma)sep=',',分號(semicolon)sep=';'和制表符(tab)。
- read.csv、read.csv2、read.delim是read.table函數的包裝,分隔符分別對應逗號,分號,制表符,同樣接受read.table所有參數。
- read.csv函數header參數默認為TRUE,不同於read.table。
data3<-read.csv('item.csv',sep=',',header=TRUE) data4<-read.table('item.csv') #下文示例采用read.csv函數,兩種寫法效果相同
- 字符型數據讀入時自動轉換為因子,因子是R中的變量,它只能取有限的幾個不同值,將數據保存為因子可確保模型函數能夠正確處理。But當變量作為簡單字符串使用時可能出錯。要想防止轉換為因子:1.令參數stringAsFactors=FALSE,防止導入的數據任何的因子轉換。2.更改系統選項options(stringsAsFactors=FALSE)3.指定抑制轉換的列:as.is=參數。通過一個索引向量指定,或者一個邏輯向量,需要轉換的列取值FALSE,不需要轉換的列取值TRUE。
data5<-read.csv('item.csv',stringAsFactors=FALSE)
- 如果數據集中含有中文,直接導入很有可能不識別中文,這時加上參數fileEncoding='utf-8'
read.csv('data.csv',fileEncoding='utf-8')
一般這些參數足夠使用,但是當導入大量數據時可能吃不消,下面一些參數可能有所幫助(其他用途當然也可以)。
讀取大量數據時,在不加內存的情況下預先分配內存是很好的選擇。
首先reaadLines函數可以獲得數據的行數(注意L為大寫)。先判斷數據量。
lines<-readLines('item.csv')
- comment.char:注釋默認是#后面的內容,也可以設置為其他字符。若數據中沒有注釋,則令comment.char=''可以加快讀取速度。
#若不包含注釋(默認為#),設置comment.cahr=''可能加快讀取速度,也可以指定注釋字符 data3<-read.csv('item.csv',comment.char='')
- nrows:讀取最大行數,再加上header。讀取大量數據時可以讀取其中一部分。
data4<-read.csv('item.csv',comment.char='',nrows=10)#讀取前10行數據和header
- skip:指定從文件開頭跳過的行數,再加上header。
#skip指定從文件開頭(不包括header)跳過的行數 data5<-read.csv('item.csv',comment.char='',nrows=10,skip=2)#跳過前兩行和header
- colClasses:指示每一列的數據類型,先分析一部分數據得到數據類型,然后指定數據類型可以加快讀取速度。另外:“NULL”指示跳過該列,不加引號的NA軟件自動識別。
#colClasses指示每一列的數據類型 classes<-sapply(data9,class) data6<-read.csv('user.csv',colClasses=classes) #NULL跳過該列 data7<-read.csv('user.csv',colClasses=list('integer','NULL','factor')) #不加引號的NA,軟件自動識別該列 data8<-read.csv('user.csv',colClasses=NA)
scan函數:返回一個向量。當讀取的數據為同一模式時,scan是最佳方式,默認讀取數值型數據。
若想讀取其他類型,使用what=參數指定。讀取大數據文件時,若想跳過某一列數據,可以在what=參數列表中使用NULL。
scan函數通常用來讀取數據矩陣,嵌入matrix函數中使用。
value<=scan('1.csv',what=c(f1=0,NULL,f3='',rep(list(NULL),6),f10=0)) #第一列、第十列為數值類型,f3=''表示第三列為字符型數據,第二列和第四列到第九列跳過。rep函數不能復制null,故用列表形式添加多個NULL data<-matrix(scan(),ncol=5,byrow=TRUE) #scan()返回一個向量,ncol=5表示組成的矩陣為五列,矩陣默認為按列存儲也可通過設置byrow=TRUE為按列存儲。
固定寬度讀取數據:read.fwf函數,header=參數,as.is=參數,sep=參數等,同read.table。widths=參數是一個向量,向量值是要讀入的字段寬度,負數表示跳過。
讀取Excel文件
如果可能的話盡量將Excel文件另保存為CSV文件,方便導入。但是無論保存為CSV還是TXT文件,都只能保存當前活動的工作表。
readxl包 可以很方便的讀取,且各個系統都通用。如果只是讀取的話,無疑是非常方便的方法。
只需要下載readxl包,用read_excel函數讀取就可以了,並且同時支持老版本的.xls格式和新版本的.xlsx格式。
#下載和引用 install.packages("readxl") library(readxl) #讀取Excel read_excel("old_excel.xls") read_excel("new_excel.xlsx") #sheet參數,指定sheet名或者數字 read_excel("excel.xls",sheet=2) read_excel("excel.xls",sheet="data") # If NAs are represented by something other than blank cells, # set the na argument read_excel("excel.xls", na = "NA")
RODBC包:只基於Windows
- 1.安裝包和引用RODBC包,安裝不加引號,引入不加引號。
- 2.連接Excel表格文件。.xls格式的Excel用odbcConnectExcel函數,.xlsx格式的Excel用odbcConnectExcel2007函數。
- 3.讀取數據:sqlFetch函數,其中默認Excel表格第一行作為列的變量名。
- 4.斷開連接。
#安裝和引用RODBC包,安裝不加引號,引入不加引號 install.packages("RODBC") library(RODBC) #創建連接 connect<-odbcConnectExcel('secert.xls') #讀取Excel表格,其中A為Sheet名(支持中文) sqlFetch(connect,'A') #關閉R與Excel表格的連接 odbcClose(connect)
XLConnect包:
- 1.安裝包和引用XLConnect包。
- 2.連接Excel表格文件:loadWorkbook函數
- 3.讀取數據:readWorksheet函數(connect,'Sheet名'),同樣默認Excel表格第一行作為列的變量名。
各個系統通用,並且不只是支持讀取,也可以寫入。
#安裝和引用XLConnect包 install.packages('XLConnect') library(XLConnect) #連接 connect<-loadWorkbook('secert.xlsx') #讀取,A為Sheet名 readWorksheet(connect,'A')