R 數(shù)據(jù)的導(dǎo)入和導(dǎo)出_第1頁(yè)
R 數(shù)據(jù)的導(dǎo)入和導(dǎo)出_第2頁(yè)
R 數(shù)據(jù)的導(dǎo)入和導(dǎo)出_第3頁(yè)
R 數(shù)據(jù)的導(dǎo)入和導(dǎo)出_第4頁(yè)
R 數(shù)據(jù)的導(dǎo)入和導(dǎo)出_第5頁(yè)
已閱讀5頁(yè),還剩37頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1、R 數(shù)據(jù)的導(dǎo)入和導(dǎo)出譯者前言不能期望一個(gè)軟件可以做所有的事情1。R 也不例外。因此, R 需要和其它東西協(xié)作。包括我們?nèi)祟?,需要我們輸入?shù)據(jù),導(dǎo)出數(shù)據(jù)。包括我們的其它軟件,Excel,SPSS,等等,數(shù)據(jù)格式都是特異的,需要R 特別處理。包括我們的數(shù)據(jù)庫(kù)系統(tǒng),R 不是用來(lái)管理數(shù)據(jù)的,所以需要專業(yè)的數(shù)據(jù)庫(kù)幫忙。也包括不同機(jī)器間,上面編譯的 R 也是需要交換數(shù)據(jù)。這一冊(cè)文檔就是描述這些事情的。R 的主要目的就是分析數(shù)據(jù)。雖然,你可以用它來(lái)處理文檔,畫個(gè)奧運(yùn)會(huì)的鳥巢,R 的主要目的還是數(shù)據(jù)分析。這是專業(yè)化個(gè)性化的時(shí)代,特色取勝。這個(gè)文檔在幾年前就寫了一些。很實(shí)用的一個(gè)文檔。開發(fā)人員可以大致了解 R

2、和其它軟件大致的通訊情況,非開發(fā)人員至少可以了解, R 通過(guò)包能直接讀取Excel表格。已經(jīng)是凌晨了,不多寫了。任何問(wèn)題和建議可以給Email!感謝身邊的朋友!丁國(guó)徽Email:ghding2008年1月6日Previous: Words from the Translator, Up: Notes致謝手冊(cè)中關(guān)系數(shù)據(jù)庫(kù)的內(nèi)容部分基于Douglas Bates 和 Saikat DebRoy早期寫的一個(gè)手冊(cè)。本手冊(cè)主要由 Brian Ripley 編寫。這里用到很多擴(kuò)展包都是由自愿者貢獻(xiàn)。這里提到的包以及主要作者如下,CORBADuncan Temple LangforeignThomas Lu

3、mley, Saikat DebRoy, Douglas Bates, Duncan Murdoch and Roger Bivandhdf5Marcus DanielsncdfDavid PiercencvarJuerg SchmidlirJavaSimon UrbanekRMySQLDavid James and Saikat DebRoyRNetCDFPavel MichnaRODBCMichael Lapsley and Brian RipleyRSPerlDuncan Temple LangRSPythonDuncan Temple LangSJavaJohn Chambers an

4、d Duncan Temple LangXMLDuncan Temple Lang1.1 Imports 導(dǎo)入導(dǎo)入 R 的數(shù)據(jù)中最容易的格式是簡(jiǎn)單的文本文件。對(duì)于小型或中型的問(wèn)題,這種格式都可以接受的。從文本文件導(dǎo)入數(shù)據(jù)的原始函數(shù)(primary function)是 scan。電子表格類似數(shù)據(jù)(Spreadsheet-like data)一章中討論的大多數(shù)比較便利的函數(shù)都是基于這個(gè)原始函數(shù)。但是,所有的統(tǒng)計(jì)顧問(wèn)們對(duì)客戶用軟盤或光盤提交一些私有的二進(jìn)制數(shù)據(jù)(比如,Excel 電子表格或SPSS文件)都比較熟悉。通常,可以做的最簡(jiǎn)單的事情是用原始軟件把數(shù)據(jù)用文本文件導(dǎo)出(而統(tǒng)計(jì)顧問(wèn)們?yōu)榱诉@個(gè)目的

5、會(huì)在他們電腦里面安裝大多數(shù)常用的軟件)。不過(guò),這不會(huì)總是可能的2。在從其它統(tǒng)計(jì)軟件中導(dǎo)入數(shù)據(jù)(Importing from other statistical systems)一章中,我們會(huì)討論一些可以在 R 里面直接讀取這些文件的工具。對(duì) Excel 電子表格,讀取Excel電子表格(Reading Excel spreadsheets)一章對(duì)可以獲得的相關(guān)方法進(jìn)行了總結(jié)。在很少的一些例子中,出于簡(jiǎn)潔和快速訪問(wèn)考慮,數(shù)據(jù)以二進(jìn)制格式保存。這種情況下一個(gè)例子是我們已經(jīng)見過(guò)幾次的圖像數(shù)據(jù)。它通常以二進(jìn)制流的方式保存然后在內(nèi)存里面呈現(xiàn),而且可能在數(shù)據(jù)前面加個(gè)信息頭。這種數(shù)據(jù)格式在二進(jìn)制文件(Bin

6、ary files)和二進(jìn)制連接(Binary connections)部分都有所討論。對(duì)于大的數(shù)據(jù)庫(kù)數(shù)據(jù),通常要借助數(shù)據(jù)庫(kù)管理系統(tǒng)(Database management system,DBMS)來(lái)處理。我們可以通過(guò)DBMS從數(shù)據(jù)庫(kù)里面提取沒(méi)有格式的文本文件,但是對(duì)于大多數(shù)這一類型的DBMS,我們可以直接通過(guò) R 的包來(lái)實(shí)現(xiàn)數(shù)據(jù)提取操作:見關(guān)系數(shù)據(jù)庫(kù)(Relational databases)部分。通過(guò)網(wǎng)絡(luò)連接來(lái)導(dǎo)入數(shù)據(jù)在網(wǎng)絡(luò)接口(Network interfaces)一章討論。Next: XML, Previous: Imports, Up: Introduction1.2 導(dǎo)出到文本文件

7、中從 R 里面導(dǎo)出結(jié)果通常是一個(gè)很少爭(zhēng)論的事情,但是實(shí)際操作中仍然有一些問(wèn)題。在知道目標(biāo)應(yīng)用軟件前提下,通常把文本文件作為最為便利的中間轉(zhuǎn)換工具。(如果需要二進(jìn)制文件,見二進(jìn)制文件(Binary files)一章)。函數(shù) cat 是導(dǎo)出數(shù)據(jù)的函數(shù)的基礎(chǔ)。它有一個(gè)file參數(shù)和append。通過(guò)連續(xù)地調(diào)用 cat 對(duì)一個(gè)文本文件寫入。最好的方式是,特別需要多次這樣做的時(shí)候,首先為寫入或添加文本打開一個(gè) file 連接,然后用cat連接,最后關(guān)掉(close)它。最常見的工作是把一個(gè)矩陣或數(shù)據(jù)框以數(shù)字的矩形網(wǎng)格方式寫入文件中,而且還可能保留行列的標(biāo)簽。這可以通過(guò)函數(shù)write.table 和 wr

8、ite 來(lái)完成。函數(shù)write僅可以寫出一個(gè)矩陣或向量的特定列(和對(duì)一個(gè)矩陣進(jìn)行轉(zhuǎn)置)。函數(shù) write.table 更為便利,它可把一個(gè)數(shù)據(jù)框(或一個(gè)可以強(qiáng)制轉(zhuǎn)換為數(shù)據(jù)框的對(duì)象)以包含行列標(biāo)簽的方式寫出。在把一個(gè)數(shù)據(jù)框?qū)懭氲揭粋€(gè)文本文件中時(shí),有許多問(wèn)題需要考慮。. 精度問(wèn)題 大多數(shù)通過(guò)這些函數(shù)對(duì)實(shí)/復(fù)數(shù)的轉(zhuǎn)換是全精度的,但是用write時(shí),精度由options(digits)的當(dāng)前設(shè)置確定。如果需要更多的控制,在一個(gè)數(shù)據(jù)框上逐列使用 format 。. 首行問(wèn)題 R 傾向在首行不出現(xiàn)表示行名字的條目,因此在文件里面. dist climb time Greenmantle 2.5 650 1

9、6.083 . .其它一些系統(tǒng)需要給行名字一個(gè)條目(可能為空),此時(shí),可以通過(guò)在write.table 中設(shè)置參數(shù)s = NA 來(lái)實(shí)現(xiàn)。. 分隔符問(wèn)題 文件中常用的字段分隔符是逗號(hào),因?yàn)樵谟⒄Z(yǔ)語(yǔ)系的國(guó)家,逗號(hào)幾乎不可能出現(xiàn)在任何字段中。這種文件被稱為 CSV(逗號(hào)分隔值)文件,對(duì)應(yīng)的包裝函數(shù)(wrapper function) write.csv提供了適當(dāng)?shù)哪J(rèn)值。在一些本地系統(tǒng)中,逗號(hào)作為十進(jìn)制位中的小數(shù)點(diǎn)(在write.csv函數(shù)中設(shè)置參數(shù)dec = ,) 3 ,此時(shí)CSV文件以分號(hào)作為字段分隔符: write.csv2 設(shè)置了適當(dāng)?shù)哪J(rèn)值。 用分號(hào)或制表符(sep = t

10、)可能是一種比較安全的選擇。. 缺損值問(wèn)題 默認(rèn)情況下,缺損值以 NA 形式輸出,但這可以通過(guò)參數(shù) na來(lái)改變。注意,NaN 在write.table里面以 NA 看待,但在cat 或 write里面是區(qū)別對(duì)待的。. 被引號(hào)括起的字符串 默認(rèn)情況下,字符串被引號(hào)括起(包括行列的名字)。參數(shù) quote 控制著字符和因子變量的引號(hào)引用問(wèn)題。 需要注意字符串中的引號(hào)嵌套問(wèn)題。三種有用的形式如下. df write.table(df) a 1 a quote write.table(df, qmethod = double) a 1 a quote write.table(df, quote = F

11、ALSE, sep = ,) a 1,a quote .逃逸(Escape)的第二種形式常用于電子表格中。.包 MASS 中的函數(shù) write.matrix 為寫矩陣提供了一種專用的接口。它同時(shí)提供了以區(qū)塊方式寫的可選項(xiàng),這樣可以降低內(nèi)存的使用。用 sink 可能把標(biāo)準(zhǔn) R 輸出重定向到一個(gè)文件中,因此捕獲了 print 語(yǔ)句(可能是暗含的)的輸出。通常,這不是最有效的辦法,options(width)設(shè)置可能需要增加。包 foreign里面的函數(shù) write.foreign 用 write.table 產(chǎn)生文本文件,同時(shí)編寫一個(gè)可以讓另外一個(gè)統(tǒng)計(jì)包讀入該文本文件的代碼文件。現(xiàn)在支持導(dǎo)出到 S

12、PSS 和 Stata。Previous: Export to text files, Up: Introduction1.3 XML 文件當(dāng)從一個(gè)文本文件中讀取數(shù)據(jù)時(shí),用戶有責(zé)任知道并且按習(xí)慣創(chuàng)建文件,比如,在導(dǎo)出問(wèn)文本文件(Export to text files)一節(jié)中提到的注釋字符,是否有信息頭行,分隔符,缺損值的描述方式(等等)。標(biāo)簽語(yǔ)言既可以描述內(nèi)容又可以定義內(nèi)容的結(jié)構(gòu),這樣可以使一個(gè)文件的內(nèi)容自我明了。此時(shí),不需要為讀取這些數(shù)據(jù)的軟件專門提供這些細(xì)節(jié)信息??蓴U(kuò)展標(biāo)簽語(yǔ)言(eXtensible Markup Language) 通常簡(jiǎn)化為 XML 可用于提供這樣的結(jié)構(gòu),不僅能描述標(biāo)

13、準(zhǔn)數(shù)據(jù)集也可以描述更復(fù)雜的數(shù)據(jù)結(jié)構(gòu)。 XML 現(xiàn)在變得非常流行,并且作為常規(guī)數(shù)據(jù)標(biāo)簽和交換的標(biāo)準(zhǔn)。它被各種團(tuán)體所采用,從地理數(shù)據(jù)(如地圖),圖像展示4 到數(shù)學(xué)等。包 XML 為在 R 和 S-PLUS 讀寫XML文檔提供了通用的工具。它讓我們可以很容易的使用這種近年出現(xiàn)的技術(shù)。多位研究人員正在探索如何在其它事情中用 XML 描述在不同應(yīng)用軟件中共享的數(shù)據(jù)集;存儲(chǔ)不同系統(tǒng)共享的 R 和 S-PLUS 對(duì)象;通過(guò) SVG (可擴(kuò)展矢量圖, Scalable Vector Graphics,XML 的一種針對(duì)矢量圖應(yīng)用的變種)描述圖像;描述函數(shù)文檔;生成“生動(dòng)的”含有文本,數(shù)據(jù)和代碼的分析/報(bào)告。對(duì)

14、 XML 包里面工具的描述已經(jīng)超出本文檔內(nèi)容范圍:詳細(xì)信息和例子見該包的主頁(yè)(/RSXML)。 CRAN里面的包 StatDataML 是基于XML包的一個(gè)例子。Next: Importing from other statistical systems, Previous: Introduction, Up: Top2 電子表格類似的數(shù)據(jù) Variations on read.table: read.table的變化樣式 Fixed-width-format files: 固定寬度格式的文件 Data Interchange Format (DIF

15、): 數(shù)據(jù)交換格式(DIF) Using scan directly: 直接使用scan函數(shù) Re-shaping data: 數(shù)據(jù)重塑 Flat contingency tables: 無(wú)格式列聯(lián)表在導(dǎo)出為文本文件(Export to text files)一節(jié),我們可以看到電子表格類似的文本文件有一系列的變化樣式。在這些樣式中,數(shù)據(jù)以矩形格子狀呈現(xiàn),而且還可能包括行列標(biāo)簽。在本節(jié),我們考慮把這種文件導(dǎo)入 R。Next: Fixed-width-format files, Previous: Spreadsheet-like data, Up: Spreadsheet-like data2.

16、1 read.table 的變化樣式函數(shù) read.table 是讀取矩形格子狀數(shù)據(jù)最為便利的方式。因?yàn)閷?shí)際可能遇到的情況比較多,所以預(yù)設(shè)了一些函數(shù)。這些函數(shù)調(diào)用了 read.table 但改變了它的一些默認(rèn)參數(shù)。注意,read.table 不是一種有效地讀大數(shù)值矩陣的方法:見下面的 scan 函數(shù)。一些需要考慮到問(wèn)題是:1. 編碼問(wèn)題 如果文件中包含非-ASCII字符字段,要確保以正確的編碼方式讀取。這是在UTF-8的本地系統(tǒng)里面讀取Latin-1文件的一個(gè)主要問(wèn)題。此時(shí),可以如下處理2. read.table(file(file.dat, encoding=latin1) 3.注意,這在任

17、何可以呈現(xiàn)Latin-1名字的本地系統(tǒng)里面運(yùn)行。4.5. 首行問(wèn)題 我們建議你明確地設(shè)定 header 參數(shù)。按照慣例,首行只有對(duì)應(yīng)列的字段而沒(méi)有行標(biāo)簽對(duì)應(yīng)的字段。因此,它會(huì)比余下的行少一個(gè)字段。(如果需要在 R 里面看到這一行,設(shè)置 header = TRUE。)如果要讀取的文件里面有行標(biāo)簽的頭字段(可能是空的),以下面的方式讀取6. read.table(file.dat, header = TRUE, s = 1) 7.列名字可以通過(guò) s 顯式地設(shè)定;顯式設(shè)定的名字會(huì)替換首行里面的列名字(如果存在的話)。8.9. 分隔符問(wèn)題 通常,打開文件看一下就可以確定

18、文件所使用的字段分隔符,但對(duì)于空白分割的文件,可以選擇默認(rèn)的sep = (它能使用任何空白符作為分隔符,比如空格,制表符,換行符), sep = 或者 sep = t。注意,分隔符的選擇會(huì)影響輸入的被引用的字符串。10.如果你有含有空字段的制表符分割的文件,一定要使用 sep = t。11.12. 引用 默認(rèn)情況下,字符串可以被 或 括起,并且兩種情況下,引號(hào)內(nèi)部的字符都作為字符串的一部分。有效的引用字符(可能沒(méi)有)的設(shè)置由參數(shù) quote 控制。對(duì)于sep = n,默認(rèn)值改為 quote = 。 如果沒(méi)有設(shè)定分隔字符,在被引號(hào)括起的字符串里面,引號(hào)需要用 C格式的逃逸方式逃逸,即在引號(hào)前面直

19、接加反斜杠 。13.如果設(shè)定了分隔符,在被引號(hào)括起的字符串里面,按照電子表格的習(xí)慣,把引號(hào)重復(fù)兩次以達(dá)到逃逸的效果。例如14. One string isnt two,one more 15.可以被下面的命令讀取16. read.table(testfile, sep = ,) 17.這在默認(rèn)分隔符的文件里面不起作用。18.19. 缺損值 默認(rèn)情況下,文件是假定用 NA 表示缺損值,但是,這可以通過(guò)參數(shù) na.strings 改變。參數(shù) na.strings 是一個(gè)可以包括一個(gè)或多個(gè)缺損值得字符描述方式的向量。 數(shù)值列的空字段也被看作是缺損值。20.在數(shù)值列,值 NaN,Inf 和 -Inf

20、都可以被接受的。21.22. 尾部空字段省略的行 從一個(gè)電子表格中導(dǎo)出的文件通常會(huì)把拖尾的空字段(包括它們的分隔符)忽略掉。為了讀取這樣的文件,必須設(shè)置參數(shù) fill = TRUE。23.24. 字符字段中的空白 如果設(shè)定了分隔符,字符字段起始和收尾處的空白會(huì)作為字段一部分看待的。為了去掉這些空白,可以使用參數(shù) strip.white = TRUE。25.26. 空白行 默認(rèn)情況下,read.table 忽略空白行。這可以通過(guò)設(shè)置 blank.lines.skip = FALSE 來(lái)改變。但這個(gè)參數(shù)只有在和 fill = TRUE 共同使用時(shí)才有效。這時(shí),可能是用空白行表明規(guī)則數(shù)據(jù)中的缺損樣本

21、。27.28. 變量的類型 除非你采取特別的行動(dòng),read.table 將會(huì)為數(shù)據(jù)框的每個(gè)變量選擇一個(gè)合適的類型。如果字段沒(méi)有缺損以及不能直接轉(zhuǎn)換,它會(huì)按 logical, integer, numeric 和 complex 的順序依次判斷字段類型。5如果所有這些類型都失敗了,變量會(huì)轉(zhuǎn)變成因子。29.參數(shù) colClasses 和 as.is 提供了很大的控制權(quán)。 as.is 會(huì) 抑制字符向量轉(zhuǎn)換成因子(僅僅這個(gè)功能)。 colClasses運(yùn)行為輸入中的每個(gè)列設(shè)置需要的類型。30.注意,colClasses 和 as.is 對(duì)每 列專用,而不是每個(gè)變量。因此,它對(duì)行標(biāo)簽列也同樣適用(如果有

22、的話)。31.32. 注釋 默認(rèn)情況下,read.table 用 # 作為注釋標(biāo)識(shí)字符。如果碰到該字符(除了在被引用的字符串內(nèi)),該行中隨后的內(nèi)容將會(huì)被忽略。只含有空白和注釋的行被當(dāng)作空白行。33.如果確認(rèn)數(shù)據(jù)文件中沒(méi)有注釋內(nèi)容,用 comment.char = 會(huì)比較安全 (也可能讓速度比較快)。34.35. 逃逸 許多操作系統(tǒng)有在文本文件中用反斜杠作為逃逸標(biāo)識(shí)字符的習(xí)慣,但是Windows系統(tǒng)是個(gè)例外(在路徑名中使用反斜杠)。在 R 里面,用戶可以自行設(shè)定這種習(xí)慣是否用于數(shù)據(jù)文件。36.read.table 和 scan 都有一個(gè)邏輯參數(shù) allowEscapes。從 R 2.2.0 開始

23、,該參數(shù)默認(rèn)為否,而且反斜杠是唯一被解釋為逃逸引用符的字符(在前面描述的環(huán)境中)。如果該參數(shù)設(shè)為是,以C形式的逃逸規(guī)則解釋,也就是控制符如 a, b, f, n, r, t, v,八進(jìn)制和十六進(jìn)制如 040 和 0x2A 一樣描述。任何其它逃逸字符都看著是自己,包括反斜杠。37.常用函數(shù) read.csv 和 read.delim 為 read.table 設(shè)定參數(shù)以符合英語(yǔ)語(yǔ)系本地系統(tǒng)中電子表格導(dǎo)出的CSV和制表符分割的文件。這兩個(gè)函數(shù)對(duì)應(yīng)的變種 read.csv2 和 read.delim2 是針對(duì)在逗號(hào)作為小數(shù)點(diǎn)的國(guó)家使用時(shí)設(shè)計(jì)的6。如果 read.table 的可選項(xiàng)設(shè)置不正確,錯(cuò)誤信

24、息通常以下面的形式顯示 Error in scan(file = file, what = what, sep = sep, : line 1 did not have 5 elements或者 Error in read.table(files.dat, header = TRUE) : more columns than column names這些信息可能足以找到問(wèn)題所在,但是輔助函數(shù) count.fields 可以進(jìn)一步的深入研究問(wèn)題所在。讀大的數(shù)據(jù)格子(data grid)時(shí),效率最重要。設(shè)定 comment.char = ,以原子向量類型(邏輯型,整型,數(shù)值型,復(fù)數(shù)型,字符型或原味

25、型)設(shè)置每列的 colClasses ,給定需要讀入的行數(shù) nrows (適當(dāng)?shù)馗吖酪稽c(diǎn)比不設(shè)置這個(gè)參數(shù)好)等措施會(huì)提高效率。見下面的例子Next: Data Interchange Format (DIF), Previous: Variations on read.table, Up: Spreadsheet-like data2.2 固定寬度格式的文件有時(shí),數(shù)據(jù)文件沒(méi)有字段分隔符,但在預(yù)先設(shè)定的列里面含有字段的內(nèi)容。在穿孔卡片的時(shí)代,這非常普遍?,F(xiàn)在,有時(shí)也用來(lái)節(jié)省文件空間。函數(shù) read.fwf 提供了一種簡(jiǎn)單的方式來(lái)讀取這樣的文件。它會(huì)制定一個(gè)向量以保存字段的寬度。該函數(shù)把文件整行地

26、讀入內(nèi)存,分割結(jié)果字符串,導(dǎo)出一個(gè)臨時(shí)的制表符分割的文件,然后調(diào)用 read.table。這對(duì)小文件已經(jīng)足夠了,但對(duì)于更復(fù)雜的東西,我們推薦采用 perl 一類的編程語(yǔ)言對(duì)文件進(jìn)行預(yù)處理。 函數(shù) read.fortran 是處理固定格式文件的一種類似的函數(shù)。它使用 Fortran格式的列規(guī)范。Next: Using scan directly, Previous: Fixed-width-format files, Up: Spreadsheet-like data2.3 數(shù)據(jù)交換模式 (DIF)曾經(jīng)用于電子表格類似的數(shù)據(jù)的舊格式是DIF,即數(shù)據(jù)交換格式。函數(shù) read.DIF 提供了讀取這種

27、文件的簡(jiǎn)單方式。它為每列設(shè)置類型的參數(shù)和 read.table 類似。在Windows里面,電子表格通常在剪貼板里面以這種格式保存電子表格數(shù)據(jù); read.DIF(clipboard) 可以直接從剪貼板里面讀取數(shù)據(jù)。這種方法比用 read.table(clipboard) 處理含有空單元的電子表格穩(wěn)健。Next: Re-shaping data, Previous: Data Interchange Format (DIF), Up: Spreadsheet-like data2.4 直接使用 scan 函數(shù)read.table 和 read.fwf 都是先用 scan 讀文件,然后處理 sc

28、an 的結(jié)果。它們非常便利,但有時(shí)直接使用 scan 效果會(huì)比較好。函數(shù) scan 有很多參數(shù)。大多數(shù)參數(shù)在函數(shù) read.table 里面也存在。其中最為關(guān)鍵的參數(shù)是 what,它是用來(lái)指定從文件中讀出的變量的模式(mode)的列表。如果該列表已經(jīng)被命名,它的名字會(huì)被用作返回列表的分量。模式可以是數(shù)值,字符或復(fù)數(shù),并且常常用例子來(lái)指定,比如 0, 或 0i。例如, cat(2 3 5 7, 11 13 17 19, file=ex.dat, sep=n) scan(file=ex.dat, what=list(x=0, y=, z=0), flush=TRUE)返回一個(gè)有三個(gè)分量的列表并且丟

29、棄文件中的第四列。還有一個(gè)非常有用的函數(shù)readLines。如果你想把所有行讀入 R 然后進(jìn)一步處理,可以用這個(gè)便利的函數(shù)。scan 的一個(gè)最普遍的應(yīng)用是讀入大的矩陣。假定文件matrix.dat 只是包括一個(gè) 200 x 2000 的矩陣7,那么我們可用 A - matrix(scan(matrix.dat, n = 200*2000), 200, 2000, byrow = TRUE)在一個(gè)測(cè)試?yán)锩?,這花費(fèi)了1秒鐘(在Linux系統(tǒng)測(cè)試的,同樣電腦上在Windows系統(tǒng)下則需要3秒鐘),而 A - as.matrix(read.table(matrix.dat)花費(fèi)了10秒鐘(和更多的內(nèi)存

30、),另外, A - as.matrix(read.table(matrix.dat, header = FALSE, nrows = 200, comment.char = , colClasses = numeric)花費(fèi)了7秒鐘。造成這種差別的原因差不多完全由于讀2000分開的短列的時(shí)間開支所致:如果它們的長(zhǎng)度是2000, scan花費(fèi)9秒,而 read.table 在比較高效地使用情況(特別是設(shè)定colClasses)下需要18秒;但缺乏技巧地使用read.table時(shí)則需要125秒!注意,時(shí)限測(cè)試依賴于讀的類型和數(shù)據(jù)本事。下面是一個(gè)讀取一百萬(wàn)個(gè)不同整數(shù)的例子: writeLines(a

31、s.character(1+1e6):2e6), ints.dat) xi - scan(ints.dat, what=integer(0), n=1e6) # 0.77s xn - scan(ints.dat, what=numeric(0), n=1e6) # 0.93s xc - scan(ints.dat, what=character(0), n=1e6) # 0.85s xf - as.factor(xc) # 2.2s DF - read.table(ints.dat) # 4.5s以及一百萬(wàn)個(gè)小集合代碼的例子: code - c(LMH, SJC, CHCH, SPC, SOM

32、) writeLines(sample(code, 1e6, replace=TRUE), code.dat) y - scan(code.dat, what=character(0), n=1e6) # 0.44s yf - as.factor(y) # 0.21s DF - read.table(code.dat) # 4.9s DF - read.table(code.dat, nrows=1e6) # 3.6s注意,這些時(shí)限測(cè)試嚴(yán)重依賴操作系統(tǒng)(Windows下面的基本讀取所花的時(shí)間至少是Linux系統(tǒng)下面的兩倍)和垃圾收集器的精度。Next: Flat contingency tab

33、les, Previous: Using scan directly, Up: Spreadsheet-like data2.5 數(shù)據(jù)重塑有時(shí),電子表格數(shù)據(jù)以一種緊湊的格式存在。它會(huì)給出各個(gè)受試者的協(xié)變量。而每個(gè)受試者后面跟著全部的觀測(cè)值。R 的建模函數(shù)需要觀測(cè)值在一列內(nèi)??紤]下面來(lái)自有重復(fù)的MRI腦測(cè)試樣本數(shù)據(jù) Status Age V1 V2 V3 V4 P 23646 45190 50333 55166 56271 CC 26174 35535 38227 37911 41184 CC 27723 25691 25712 26144 26398 CC 27193 30949 29693

34、29754 30772 CC 24370 50542 51966 54341 54273 CC 28359 58591 58803 59435 61292 CC 25136 45801 45389 47197 47126每個(gè)受試者有兩個(gè)協(xié)變量(covariate)和最多4個(gè)測(cè)量。該數(shù)據(jù)從Excel里面導(dǎo)出,文件名為 mr.csv 。我們可以用函數(shù) stack 來(lái)幫助操作以給出唯一的相應(yīng)。 zz - read.csv(mr.csv, strip.white = TRUE) zzz reshape(zz, idvar=id,timevar=var, varying=list(c(V1,V2,V3,

35、V4),direction=long) Status Age var V1 id 1.1 P 23646 1 45190 1 2.1 CC 26174 1 35535 2 3.1 CC 27723 1 25691 3 4.1 CC 27193 1 30949 4 5.1 CC 24370 1 50542 5 6.1 CC 28359 1 58591 6 7.1 CC 25136 1 45801 7 1.2 P 23646 2 50333 1 2.2 CC 26174 2 38227 2 .函數(shù) reshape 有比stack 更為復(fù)雜的語(yǔ)法。但是它可以處理比前面例子中列的數(shù)目更多的長(zhǎng)格式數(shù)據(jù)。

36、利用 direction=wide,reshape 也可以進(jìn)行相反方向的操作。Previous: Re-shaping data, Up: Spreadsheet-like data2.6 無(wú)格式列聯(lián)表用數(shù)組方式展示高維列聯(lián)表示很不方便的。在分類數(shù)據(jù)分析中,這種信息常常以含有邊的帶行列組合的因子水平對(duì)應(yīng)的單元計(jì)數(shù)的二維數(shù)組來(lái)體現(xiàn)。行和列是典型的“參差”排列,因?yàn)橹辉谒鼈兏淖儠r(shí)才顯示標(biāo)簽。一個(gè)明顯的習(xí)慣是,行從頂往底部讀,而列從左往右讀。在 R 里面,這種“無(wú)格式”的列聯(lián)表可以用函數(shù) ftable 創(chuàng)建。 ftable 用一個(gè)適合的打印方法創(chuàng)建類 ftable 的對(duì)象。舉個(gè)簡(jiǎn)單的例子,考慮 R

37、的標(biāo)準(zhǔn)數(shù)據(jù)集 UCBAdmissions。這是一個(gè)3維列聯(lián)表,用于對(duì)1973年UC Berkeley 研究生部六個(gè)最大的系的學(xué)生申請(qǐng)按照入學(xué)和性別的分類。 data(UCBAdmissions) ftable(UCBAdmissions) Dept A B C D E F Admit Gender Admitted Male 512 353 120 138 53 22 Female 89 17 202 131 94 24 Rejected Male 313 207 205 279 138 351 Female 19 8 391 244 299 317這種顯示方式無(wú)疑比數(shù)據(jù)的3維數(shù)組描述方式更有

38、用。還有一個(gè)函數(shù) read.ftable 用于從文件中讀取無(wú)格式的列聯(lián)表。為了處理試圖準(zhǔn)確地描述行和列變量名字和水平信息的列聯(lián)表變體,這個(gè)函數(shù)還有一些其它參數(shù)。read.ftable 的幫助頁(yè)面有一些非常有用的例子。無(wú)格式列聯(lián)表可以用 as.table 轉(zhuǎn)換成數(shù)組格式的標(biāo)準(zhǔn)列聯(lián)表。注意,無(wú)格式列聯(lián)表的特征就是行(可能還有列)標(biāo)簽的“參差”排列。如果給定行變量水平的所有格子(grid),應(yīng)該使用函數(shù) xtabs 從這種數(shù)據(jù)創(chuàng)建列聯(lián)表,而不是用 read.table 讀取數(shù)據(jù)。Next: Relational databases, Previous: Spreadsheet-like data,

39、Up: Top3 導(dǎo)入其它統(tǒng)計(jì)軟件的數(shù)據(jù)在本章,我們研究如何讀取其它統(tǒng)計(jì)系統(tǒng)生成二進(jìn)制數(shù)據(jù)文件問(wèn)題。最好避免這種問(wèn)題,但若沒(méi)法得到原始系統(tǒng)的時(shí)候,這種問(wèn)題又是不可避免的。 EpiInfo Minitab SAS S-PLUS SPSS Stata Systat: EpiInfo Minitab SAS S-PLUS SPSS Stata Systat Octave: OctaveNext: Octave, Previous: Importing from other statistical systems, Up: Importing from other statistical system

40、s3.1 EpiInfo, Minitab, S-PLUS, SAS, SPSS, Stata, Systat推薦包 foreign 提供了導(dǎo)入這些統(tǒng)計(jì)系統(tǒng)產(chǎn)生的文件,導(dǎo)出 Stata或SPSS 格式數(shù)據(jù)的工具。在一些情況下,這些函數(shù)可能 read.table 需要的內(nèi)存少很多。 write.foreign (見導(dǎo)出到文本文件(Export to text files)現(xiàn)在支持 SPSS 和 Stata 類型的數(shù)據(jù)導(dǎo)出機(jī)制。EpiInfo 版本5和6保存的數(shù)據(jù)是自我描述的固定寬度的文本文件。 read.epiinfo 可以讀入這些 .REC 文件到一個(gè) R 數(shù)據(jù)框。 EpiData 也產(chǎn)生這種

41、格式的數(shù)據(jù)。函數(shù) read.mtp 可以導(dǎo)入Minitab便攜式工作表 (Minitab Portable Worksheet)文件。該函數(shù)返回一個(gè)以工作表作為分量的 R 列表。函數(shù) read.xport 讀入SAS傳輸格式(XPORT)的文件,并且返回一個(gè)數(shù)據(jù)框的列表。如果你的系統(tǒng)安裝了SAS,函數(shù) read.ssd 可用來(lái)創(chuàng)建和運(yùn)行以傳輸格式保存 SAS永久數(shù)據(jù)集(.ssd 或 .sas7bdat)的SAS腳本。它隨后調(diào)用 read.xport 去讀取結(jié)果文件。包 Hmisc 有個(gè)類似的函數(shù) sas.get,它也是允許SAS腳本。函數(shù) read.S 可以讀?。?2位)Unix或Window

42、s(或其它操作系統(tǒng))上由S-PLUS 3.x,4.x 或 2000 產(chǎn)生二進(jìn)制對(duì)象。這能讀取許多但不是全部的 S 對(duì)象:特別是,它只能讀取向量,矩陣,數(shù)據(jù)框和含有這類數(shù)據(jù)對(duì)象的列表。函數(shù) data.restore 用于讀 S-PLUS 的轉(zhuǎn)儲(chǔ)數(shù)據(jù)(data dump)(由 data.dump 創(chuàng)建)。它有同樣的限制(除了平臺(tái)的轉(zhuǎn)儲(chǔ)數(shù)據(jù)也可被讀取)。它還可能讀取來(lái)自 S-PLUS 5.x 和 6.x 通過(guò)data.dump(oldStyle=T) 寫出的轉(zhuǎn)儲(chǔ)數(shù)據(jù)。如果可以訪問(wèn) S-PLUS,更可靠的方式是在 S-PLUS 里面導(dǎo)出(dump)對(duì)象文件然后在 R 里面載入執(zhí)行(source)該文件

43、。在S-PLUS 5.x 和 6.x 里面,需要用 dump(., oldStyle=T),對(duì)于讀入大對(duì)象,優(yōu)先使用用轉(zhuǎn)儲(chǔ)文件作為批量的腳本而非source。函數(shù) read.spss 可以讀取 SPSS 里面 save 和 export 命令創(chuàng)建的文件。它返回一個(gè)由被保存數(shù)據(jù)集中每個(gè)變量對(duì)應(yīng)分量的列表。含有值標(biāo)簽的 SPSS 變量可以選擇轉(zhuǎn)換為 R 因子。SPSS 數(shù)據(jù)入口(Data Entry)是創(chuàng)建數(shù)據(jù)輸入的窗體。默認(rèn)情況下,它創(chuàng)建一種read.spss不能處理的含有額外格式信息的數(shù)據(jù)文件。但是,它可能以普通的 SPSS 格式導(dǎo)出數(shù)據(jù)。Stata 的 .dta 文件是二進(jìn)制文件格式。函數(shù)r

44、ead.dta 和 write.dta 可以讀寫版本 5,6,7/SE和8的Stata 文件。有值標(biāo)簽的Stata變量可以選擇性地轉(zhuǎn)換為 R 因子(反之也行)。函數(shù) read.systat 可以讀取 Systat 在小字節(jié)序機(jī)器(little-endian machines)(比如Windows)上保存(SAVE)的矩形的數(shù)據(jù)文件(mtype = 1)。這些文件的擴(kuò)展名為 .sys 或 .syd (最近)。Previous: EpiInfo Minitab SAS S-PLUS SPSS Stata Systat, Up: Importing from other statistical sy

45、stems3.2 OctaveOctave 是一種線性代數(shù)的數(shù)值運(yùn)算系統(tǒng)(),來(lái)自包 foreign 的 函數(shù) read.octave 可以讀入 Octave 用命令 save -ascii 創(chuàng)建的文本數(shù)據(jù)格式。該格式支持變量的大多數(shù)通用類型,包括標(biāo)準(zhǔn)的原子型(實(shí)和復(fù)標(biāo)量/矩陣,和N維數(shù)組,字符串,極差(range),和布爾值標(biāo)量/矩陣)和遞歸式(結(jié)構(gòu)體(structs),單元(cells)和列表)。Next: Binary files, Previous: Importing from other statistical systems, Up: To

46、p4 關(guān)系數(shù)據(jù)庫(kù) Why use a database?: 為什么使用數(shù)據(jù)庫(kù)? Overview of RDBMSs: 對(duì)RDBMs的回顧 R interface packages: R 的接口包Next: Overview of RDBMSs, Previous: Relational databases, Up: Relational databases4.1 為什么使用數(shù)據(jù)庫(kù)?R 可以很好處理的數(shù)據(jù)類型是有限的。既然所有R 處理的數(shù)據(jù)都放在內(nèi)存中,并且在一個(gè)函數(shù)的執(zhí)行過(guò)程中會(huì)創(chuàng)建一個(gè)數(shù)據(jù)集的多個(gè)拷貝,因此R不適合處理很大的數(shù)據(jù)集。大于一百兆(或少一點(diǎn))的數(shù)據(jù)對(duì)象會(huì)導(dǎo)致 R的內(nèi)存溢出。R

47、不容易支持并發(fā)訪問(wèn)數(shù)據(jù)。也就是說(shuō),如果多于一個(gè)用戶在訪問(wèn)或者更新同一個(gè)數(shù)據(jù),一個(gè)用戶的修改對(duì)另外一個(gè)用戶是不可見的。R 支持?jǐn)?shù)據(jù)的永久性,因?yàn)橛脩粜枰獜囊粋€(gè)回話中保存數(shù)據(jù)對(duì)象或整個(gè)工作表而在隨后的會(huì)話中再次保存。但被保存數(shù)據(jù)的格式對(duì) R 是特有的,在其它系統(tǒng)里面不是那么容易被處理。數(shù)據(jù)庫(kù)管理系統(tǒng)(Database Management Systems,DBMSs)和,特別是,關(guān)系數(shù)據(jù)庫(kù)管理系統(tǒng)(RDBMSs)是為了更好地做這些事情而設(shè)計(jì)。. 它們加強(qiáng)的地方在于1. 提供對(duì)大型數(shù)據(jù)庫(kù)中被選擇部分的快速訪問(wèn)。2. 強(qiáng)大的針對(duì)數(shù)據(jù)庫(kù)的列進(jìn)行匯總和交叉列表(cross-tabulate)的功能。3.

48、以更有條理的方式存儲(chǔ)數(shù)據(jù)。這比電子表和R的數(shù)據(jù)框的矩形網(wǎng)格格式更容易組織。4. 支持運(yùn)行于不同主機(jī)上面的客戶端的并發(fā)訪問(wèn),同時(shí)加強(qiáng)數(shù)據(jù)訪問(wèn)的安全性限制。5. 有能力作為一個(gè)服務(wù)很多客戶端的服務(wù)器。DBMS可能要用到的統(tǒng)計(jì)應(yīng)用的類型是從數(shù)據(jù)中提取1%的樣本,對(duì)數(shù)據(jù)交差列表(cross-tabulate)以產(chǎn)生一個(gè)多維的列聯(lián)表,和為單獨(dú)的分析從數(shù)據(jù)庫(kù)中提取數(shù)據(jù)組。Next: R interface packages, Previous: Why use a database?, Up: Relational databases4.2 對(duì)RDBMs的回顧已經(jīng)有很多大型的(也是很貴的)商業(yè)的關(guān)系數(shù)據(jù)庫(kù)

49、管理系統(tǒng)( Informix; Oracle; Sybase; IBM的 DB/2;Microsoft運(yùn)行在Windows系統(tǒng)上的 SQL Server)和學(xué)術(shù)的小型系統(tǒng)的數(shù)據(jù)(如 MySQL,PostgreSQL, Microsoft Access,.)。前者都會(huì)強(qiáng)調(diào)數(shù)據(jù)安全性特征。但是界限是很模糊的,比如開源的PostgreSQL有越來(lái)越多的高端特性 8,以及免費(fèi)的Informix,Oracle和Sysbase在Linux系統(tǒng)下面都可以獲得。還有其它常常使用的數(shù)據(jù)源,包括電子表格,非關(guān)系型數(shù)據(jù)庫(kù),甚至文本文件(可能已經(jīng)壓縮過(guò)的)。開放數(shù)據(jù)庫(kù)互連(Open Database Connecti

50、vity,簡(jiǎn)寫為 ODBC)是使用所有這些數(shù)據(jù)源的標(biāo)準(zhǔn)。它源于 Windows系統(tǒng)(見本章后面描述的所有包都提供了客戶端/服務(wù)器數(shù)據(jù)庫(kù)的客戶端。數(shù)據(jù)庫(kù)可以放置在一樣的機(jī)器上或遠(yuǎn)程(這更常見)。數(shù)據(jù)庫(kù)交互時(shí)有一個(gè) ISO 標(biāo)準(zhǔn)(事實(shí)上有好多種: SQL92 就是 ISO/IEC 9075,也被稱為 ANSI X3.135-1992,此外 SQL99 也逐步被使用了)的的交互語(yǔ)言SQL (結(jié)構(gòu)化查詢語(yǔ)言,Structured Query Language,有時(shí)讀作sequel:見 Bowman et al. 1996 以及 Kline 和 Kline 2001)。不同的DBMSs對(duì)這個(gè)標(biāo)準(zhǔn)都是在一

51、定程度上支持。 SQL queries: SQL查詢 Data types: 數(shù)據(jù)類型Next: Data types, Previous: Overview of RDBMSs, Up: Overview of RDBMSs4.2.1 SQL 查詢對(duì)于常規(guī)操作,非常全面的 R 接口可以產(chǎn)生SQL,但是對(duì)于復(fù)雜操作,只有直接使用 SQL。習(xí)慣上,SQL 用大寫字母編寫,但是很多用戶發(fā)現(xiàn)在 R 接口函數(shù)里面用小寫比較方便。一個(gè)關(guān)系型DBMS以 表格(tables) (或 關(guān)系(relations)數(shù)據(jù)庫(kù)的方式存儲(chǔ)數(shù)據(jù)。數(shù)據(jù)庫(kù)的表格和 R 的數(shù)據(jù)框類似,因?yàn)樗鼈兌际怯赏活愋停〝?shù)值,字符,日期,貨

52、幣,.)的 列(column)或者 字段(fields)和 包含實(shí)體觀測(cè)數(shù)據(jù)的 行(row)或 記錄(record)組成。SQL 查詢是關(guān)系數(shù)據(jù)庫(kù)里面最常用的操作。典型的查詢是下面類型的SELECT語(yǔ)句 SELECT State, Murder FROM USArrests WHERE Rape 30 ORDER BY Murder SELECT t.sch, c.meanses, t.sex, t.achieve FROM student as t, school as c WHERE t.sch = c.id SELECT sex, COUNT(*) FROM student GROUP BY sex SELECT sch, AVG(sestat) FROM student GROUP BY sch LIMIT 10上面語(yǔ)句的第一條從已經(jīng)復(fù)制到一個(gè)數(shù)據(jù)庫(kù)表的 R 數(shù)據(jù)框USArrests 數(shù)據(jù)中選擇兩列,基于第三列做子集操作,并且讓結(jié)果數(shù)據(jù)排序。第二條語(yǔ)句連接(join)兩

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論