1. 程式人生 > >R語言資料輸入輸出

R語言資料輸入輸出



資料的輸入輸出,包括計算機系統中R語言的鍵盤輸入和顯示器輸出,程式的資料輸入和執行結果輸出。

2.7.1  R語言的輸入和輸出

所謂使用者、程式設計師和計算機互動又稱為人機互動,請注意人機互動並不代表科學實驗。在R語言中稱為開始一個會話,與網路中開始的會話section相同。R語言的命令在命令列>中輸入,而且與UNIX系統的shell批處理命令程式類似,R語言可將多個命令集合在一起構成一個指令碼檔案,然而問題是該指令碼檔案的輸出在哪裡?R語言命令指令碼檔案的輸出可在顯示器,也可定向輸出到一個檔案中。

1. R語言的輸入

   R語言系統的輸入可以是命令,R語言直譯器的輸入則是命令程式。命令集的指令碼檔案可儲存為

.R檔案,再用source()命令完成批處理。

>source(Rlcommand.R)   #執行一個指令碼檔案

然而source()函式的另一個功能是編譯一個R語言程式或者函式。例如,函式funfactor()儲存在funfactor.R檔案中,則編譯並且呼叫函式funfactor()的方法,

>source(funfactor.R)   #編譯funfactor.R檔案

>saladrink=funfactor(dafr,salary,levels)  #呼叫函式funfactor()

    R語言程式在編輯視窗輸入,可用edit()命令。或者用R語言系統選單建立一個

.R檔案再儲存。

2.R語言的輸出

若將R語言系統的輸出重定向到文字檔案resultgrep中,則使用sink()命令。

>sink(resultgrep)  

R語言命令的輸出將在resultgrep檔案中看到。可不再讓直譯器把每一條輸出到顯示器上。

若重定向圖形輸出,例如plot()的輸出,可儲存在圖形檔案中。根據圖形的屬性,選擇命令執行。最後將圖形重定向恢復設定為顯示器輸出。windows圖元檔案和.bmp檔案分別是,

>win.metafile("ts1.wmf")   #將圖形重定向到ts1.wmf檔案中

>bmp("ts1.bmp")          #將圖形儲存到

ts1.bmp檔案,.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.framestringsAsFactors=FALSE設定所有的字元儲存為字串型別預設則是因子factor

讀取.xlsx檔案,應安裝軟體包xls,rJavarJava軟體包必須設定java環境。在系統中設定環境變數pathjavapath等。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資料

foreignread.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軟體包。