R語言資料輸入輸出
資料的輸入輸出,包括計算機系統中R語言的鍵盤輸入和顯示器輸出,程式的資料輸入和執行結果輸出。
2.7.1 R語言的輸入和輸出
所謂使用者、程式設計師和計算機互動又稱為人機互動,請注意人機互動並不代表科學實驗。在R語言中稱為開始一個會話,與網路中開始的會話section相同。R語言的命令在命令列>中輸入,而且與UNIX系統的shell批處理命令程式類似,R語言可將多個命令集合在一起構成一個指令碼檔案,然而問題是該指令碼檔案的輸出在哪裡?R語言命令指令碼檔案的輸出可在顯示器,也可定向輸出到一個檔案中。
1. R語言的輸入
R語言系統的輸入可以是命令,R語言直譯器的輸入則是命令程式。命令集的指令碼檔案可儲存為
>source(Rlcommand.R) #執行一個指令碼檔案
然而source()函式的另一個功能是編譯一個R語言程式或者函式。例如,函式funfactor()儲存在funfactor.R檔案中,則編譯並且呼叫函式funfactor()的方法,
>source(funfactor.R) #編譯funfactor.R檔案
>saladrink=funfactor(dafr,salary,levels) #呼叫函式funfactor()
將R語言程式在編輯視窗輸入,可用edit()命令。或者用R語言系統選單建立一個
2.R語言的輸出
若將R語言系統的輸出重定向到文字檔案resultgrep中,則使用sink()命令。
>sink(resultgrep)
則R語言命令的輸出將在resultgrep檔案中看到。可不再讓直譯器把每一條輸出到顯示器上。
若重定向圖形輸出,例如plot()的輸出,可儲存在圖形檔案中。根據圖形的屬性,選擇命令執行。最後將圖形重定向恢復設定為顯示器輸出。windows圖元檔案和.bmp檔案分別是,
>win.metafile("ts1.wmf") #將圖形重定向到ts1.wmf檔案中
>bmp("ts1.bmp") #將圖形儲存到
>dev.off() #輸出返回到顯示器
2.7.2程式的資料輸入和輸出
R語言作為開源軟體,它的優勢是共享和方便使用者,它的不利是不正式和不能形成行業。但是,R語言的資料來源開放了世界無數的視窗,使有用的資料流動在我們的周圍。R語言的資料來源,不僅僅是程式設計師誠實地在鍵盤上輸入得到的,R語言能匯入.txt檔案、execl檔案、流行的商業統計軟體SAS,SPSS,Stata檔案,資料庫的資訊和網路上的資料。
1.程式讀取鍵盤輸入
若只有少量資料,用函式scan()和readline()接收資料。函式scan()從鍵盤接收輸入並且輸出向量,將檔名設定為空,並且接收到空行則表示鍵盤輸入結束。scan()的安靜模式可用quiet=TRUE設定。scan()只接收數值和單字元的輸入,而readline()接收字串。
>dv1=scan("")
1: 1 2 3 4 5
6:
>dv1
[1] 1 2 3 4 5
>dv2=scan("")
1: a
2: b
3: c
4:
>dv2
[1]
readline()有兩種用途。一個是用readline()方式接收輸入一行字串,儲存在字串向量中。一個是readline("提示內容"),根據提示輸入答案。例如,在鍵盤輸入"I hope we go to university together ,but now war is dealed with,please wait for victory."並且儲存到向量dv3中。
>dv3=readline()
I hope we go to university together ,but now war is dealed with,please wait for victory.
>dv3
##[1] I hope we go to university together ,but now war is dealed with,please wait for victory.
> dv4=readline("There is your in fact.") #根據提示"There is your in fact."輸入回答
There is your in fact.Yes. #Yes是回答(實際情況)
> dv4
[1] "Yes." 2.讀取windows檔案
scan("filename.txt")快速讀取.txt檔案到一個向量,若是包括字元的檔案,則引數what=""。
>dv5=scan(file1.txt,what="")
Read 5 items.
[1] "1" "2" "3" "quiet" "study" 若windows的.txt檔案內容是資料框,則用函式read.table()讀取。若資料分析員從事分析execl檔案的工作,則可用read.xlsx()讀取.xlsx檔案,read.xls()讀取.xls檔案。csv格式檔案可用read.csv()讀取。readLines()可在文字檔案中讀取多行資料或者整個檔案。.txt檔案是空格分隔符,.csv檔案是“;”分隔符。
函式read.table()的引數file設定了檔案路徑,header設定表頭,sep設定列間隔方式。輸出資料是data.frame。stringsAsFactors=FALSE設定所有的字元儲存為字串型別,預設則是因子factor。
讀取.xlsx檔案,應安裝軟體包xls,rJava。rJava軟體包必須設定java環境。在系統中設定環境變數path和javapath等。read.xlsx()應注意sheet引數的設定。
>file1="D:/travers/dog.xlsx"
>datafr1=read.xlsx(file1,1) #sheet=1
批量讀取檔案的方法應該先將批量讀取檔案存放在固定目錄下。用dir()函式獲取目錄中的檔名,然後用paste()合成路徑,最後處理文件。對批量檔案可用迴圈或apply族函式處理。例如:
>doc.names =dir("path")
>doc.path =sapply(doc.names,function(names) paste(path,names,sep='/'))
#合成檔案路徑名
>doc =sapply(doc.path,function(doc) readLines(doc))
3.匯入統計軟體資料
(1) SPSS資料
SPSS統計軟體的.sav檔案用函式read.spss()讀取,儲存在資料框中。read.spss()所在軟體包foreign。或者使用Hmisc軟體包的函式spss.get()。函式spss.get()封裝read. spss(),設定引數,最後得到資料分析人員期望的結果。
>library(Hmisc)
>daf=spss.get("data2076.sav",use.value.labels=TRUE) #讀取.sav檔案
use.value.labels=TRUE表示將有標籤的變數儲存為因子,而且水平相同。
(2)匯入SAS資料
foreign包中的read.ssd()和Hmisc包中的sas.get()可讀取。注意SAS的較新版本(SAS 9.1或更高版本)可能導致函式並不能正常使用。儲存為Transport format(XPORT)檔案,可用foreign的函式read.xport()讀取。
4.在www網站讀取資料
(1) read.csv()讀取資料集
為保證例題的正確性,選擇《R語言程式設計藝術》P208頁上的例題。函式paste()下載美國加州大學歐文分校的Echocardiogram資料集,儲存為.csv檔案。
>urluci="http://archive.ics.uci.edu/ml/machine-learning-databases/"
>databasefile=paste(urluci,"echocardiogram/echocardiogram.data",sep=" ")
#paste()合成檔名
>dataframe1=read.csv(databasefile) #讀取網路檔案資料集
(2) read.table()讀入資料檔案
read.table 函式用url地址表示檔案,格式非常簡單。
> addr=http://www.abcd.com/de.txt
> read.table(file=url(addr))
(3)從網頁抓取資料
網頁資料有不同格式,可用不同函式讀取。readLines()讀取文字,readHTMLTable()讀取所有表格。 Web資料抓取(Webscraping)過程中,使用者從網際網路上提取嵌入在網頁中的資訊,並儲存為R語言的列表list。一個方法是使用函式readLines()下載網頁,再用grep()過濾資訊和gsub()函式處理。readLines()按行讀取文字檔案,一些非結構化的文字檔案,例如電子郵件資料或微博資料,也可使用readLines()。web檔案可用單引號,用n=行數表示讀取的範圍。例如,希望讀取哈佛大學html主頁前十行的資料,方法見下,
> urlnetaddr='http://www.harvard.edu/' #哈佛大學網址
> dlisa1=readLines(urlnetaddr,n=50)
> dlisa1
>names(disa1) #資料標籤
另一種途徑的方法是RCurl包和XML包來提取結構複雜的網頁中的資訊。 此外,scan()也有豐富的引數用來讀取非結構化文件。若抓取網頁上的表格,可使用XML包的readHTMLTable()函式。函式readHTMLTable()可讀取XML資料。
>head(dlisa1[[2]]) #dlisa1是列表
讀取《計算機學報》PDF檔案http://cjc.ict.ac.cn/online/onlinepaper/cjj-2016823101705.pdf不能使用readLines(),請讀者自己思考方法。
4.寫檔案 儲存程式的臨時資料到tmp.txt檔案,或者將結果儲存到result1.xlsx檔案,可用函式write.table()與write.csv(),並且可寫到表格型資料檔案。cat()函式也能輸出檔案。
另外,與MySQL資料庫交換資料可使用RMySLQ軟體包。