《R語言入門》的讀書筆記
本書的重點內(nèi)容及感悟:
第一章 導(dǎo)言
1步绸、R是一個有著統(tǒng)計分析功能及強大作圖功能的軟件系統(tǒng)。R內(nèi)含了許多實用的統(tǒng)計分析及作圖參數(shù)。作圖參數(shù)能將產(chǎn)生的展示在一個獨立的窗口中捎拯。并能將之保存為各種形式的文件(jpg,png,bmp,ps,pdf,emf,pictex,xfig)坤按,具體形式取決于操作系統(tǒng)毯欣。統(tǒng)計分析的結(jié)果也能被直接顯示出來,一些中間(如P-值晋涣,回歸系統(tǒng)仪媒,殘差等)既可保存到專門的文件中,也可以直接用作進一步的分析谢鹊。
2算吩、在R語言中,使用者可以使用循環(huán)語句來連續(xù)分析多個數(shù)據(jù)集佃扼,也可將多個不同的統(tǒng)計函數(shù)結(jié)合在一個語句中執(zhí)行更復(fù)雜的分析偎巢。R使用者還可以借鑒網(wǎng)上提供的用S編寫的大量程序,而且大多數(shù)都能被R直接調(diào)用兼耀。
3压昼、非專業(yè)人員起初可能覺得R相對比較復(fù)雜,其實瘤运,R的一個非常突出的優(yōu)點正是它的靈活性窍霞。一般的軟件往往會直接展示分析的結(jié)果,而R則將這些結(jié)果都存在一個對象object里面拯坟,所以常常在分析執(zhí)行結(jié)束后并不顯示任何結(jié)果但金。使用者可能會對此感到困惑,其實這樣的特點是非常有用的郁季,因為我們可以選擇的從結(jié)果中只抽出我們感興趣的部分冷溃。例如,我們要運行20個回歸分析而只想比較其回歸系統(tǒng)梦裂,在R中就可以選擇只顯示所有分析得出的回歸系統(tǒng)似枕,這樣結(jié)果僅僅占了一排,而用有些軟件可能會一下打開20個窗口年柠。
第二章 基本原理與概念
1凿歼、基本原理
因為R是一種編程語言,一些對編程不太熟悉的人可能會望而卻步,這種障礙其實是完全沒有必要的毅往。首先R是一種解釋型語言牵咙,而不是編譯語言,也就意味著輸入的命令能夠執(zhí)行攀唯,而不需要像一些語言要首先構(gòu)成一個完整的程序形式洁桌。第二、R的語法非常簡單和直觀侯嘀。例如另凌,線性回歸的命令lm(y~x)表示以x為自變量,y為因變量來擬合一個線性模型戒幔。合法的R函數(shù)總是帶有圓括號的形式吠谢,即使括號內(nèi)沒有內(nèi)容(如,ls())。如果直接輸入函數(shù)名而不輸入括號诗茎,R則會自動顯示該函數(shù)的一些具體內(nèi)容工坊。
在R中進行的所有操作都是針對存儲在活動內(nèi)存中的對象的。對數(shù)據(jù)敢订,結(jié)果或圖表的輸入與輸出都是通過在對計算機硬盤中的文件讀寫而實現(xiàn)王污。用戶通過輸入一些命令調(diào)用函數(shù),分析得出的結(jié)果可以被直接顯示在屏幕上楚午,也可以被存入某個對象對被寫入硬盤昭齐。因為產(chǎn)生的結(jié)果本身就是一種對象,所以它們也能被視為數(shù)據(jù)并能像一般數(shù)據(jù)那樣被處理分析矾柜。數(shù)據(jù)文件即可從本地磁盤讀取也可通過網(wǎng)絡(luò)傳輸從遠(yuǎn)程服務(wù)器端獲得阱驾。
所有能使用的R函數(shù)都被包含在一個庫(library)中,該庫存放在磁盤的/library目錄下怪蔑,這個目錄下含有具有各種功能的包里覆,各個包也是按照目錄的方式組織起來的。其中名為base包含可以算是R的核心缆瓣,因為它內(nèi)嵌了R語言中所有像數(shù)據(jù)讀寫與操作這些最基本的函數(shù)喧枷。在上述目錄中的每一個包內(nèi),都有一個目錄R捆愁,這個目錄里又都含有一個與此包同名的文件(如/library/base/r/base)。該文件正是存放所有函數(shù)的地方窟却。
R語言中最簡單的命令莫過于通過輸入一個對象的名字來顯示其內(nèi)容了昼丑。例如,一個名為n的對象夸赫,其內(nèi)容是數(shù)值10菩帝;
>n
[1] 10
該命令的功能在這里于函數(shù)print相似,輸出結(jié)果與print(n)相同。對象的名字必須是以一個字母開頭呼奢,中間可以包含字母宜雀,數(shù)字,點握础,及下劃線辐董。因為R對對旬的名字區(qū)分大小寫。所以x和X就可以代表兩個完全不同的對象禀综。
2简烘、對象的產(chǎn)生,排列及刪除
一個對象可以通過賦值操作來產(chǎn)生定枷。
>n<-15 ? ? //該符號可以是從左到右的方向孤澎,也可以相反。>5->n是一樣的欠窒。如果該對象存在覆旭,那么它以膠的值將會自動被新值沖掉(這種修改只會影響內(nèi)存中的數(shù)據(jù),操作結(jié)果暫時不會被保存到硬盤中)岖妄。在R中給對象賦值有多種形式型将,可以是直接賦一個數(shù)值,也可以是一個算式或一個函數(shù)的結(jié)果衣吠。>n<-15+2或>n<-15+rnom(1)茶敏。運行rnom(1)將產(chǎn)生一個服從平均數(shù)為0,標(biāo)準(zhǔn)差為1的標(biāo)準(zhǔn)正態(tài)分布的隨機變量缚俏。
>n<-15惊搏;name<-15+5;m<-1
函數(shù)ls的功能是顯示所有在內(nèi)存中的對象:只會列出對象。注意在R中應(yīng)該用分號來隔開同一行中的不同命令語句忧换。如果只要顯示出在名稱中帶有某個指定字符的對象恬惯。>ls(pat="m")。如果進一步限為顯示在名稱中以某個字母開關(guān)的對象亚茬,則可:>ls(pat="^m")酪耳。運行函數(shù)ls.str()將會展示內(nèi)存中所有對象的詳細(xì)信息。
在ls.str()將會列出關(guān)于對象的所有信息刹缝,包括數(shù)據(jù)框碗暗、矩陣、數(shù)據(jù)列表的列數(shù)信息梢夯,因此展示結(jié)果可能會很長言疗。ls.str(pat="^m",max.level=-1)就可以避免這種情況了。
要在內(nèi)存中刪除某個對象颂砸,可利用函數(shù)rm:運行rm(x)將會刪除對象x噪奄,運行rm(x,y)將會刪除對象x和y死姚。而運行rm(list=ls())則會刪除內(nèi)存中的所有對象。
3勤篮、在線幫助
R中給予的在線幫助能提供關(guān)于如何使用函數(shù)的非常有用的信息都毒。關(guān)于某個特定函數(shù)的幫助能夠直接被調(diào)出來。如運行>?lm會立即顯示關(guān)于函數(shù)lm()的幫助頁面碰缔。
第三章 R的數(shù)據(jù)操作
1账劲、對象
R通過一些對象來運行,當(dāng)然首先這些對象是用它們的名稱和內(nèi)容來刻畫的手负,其次也通過對象的數(shù)據(jù)類型即屬性來刻畫涤垫。對象的類型和長度可以分別通過函數(shù)mode和length得到.
對象的類型:向量是一個變量,其意思也即人們通常認(rèn)為的那樣竟终;因子是一個分類變量蝠猬;數(shù)組是一個k維的數(shù)據(jù)表;矩陣是數(shù)組的一個特例统捶,其維數(shù)k=2榆芦。注意,數(shù)組或者矩陣中的所有元素都必須是同一種類型的喘鸟;數(shù)據(jù)框是由一個或幾個向量或因子構(gòu)成匆绣。它們必須是等長的。但可以是不同的數(shù)據(jù)類型什黑。ts是時間序列數(shù)據(jù)崎淳,它包含一些額外的屬性,例如頻率和時間愕把;列表可以包含任何類型的對象拣凹,包括列表。對于一個向量恨豁,用它的類型和長度足夠描述數(shù)據(jù)柜蜈;而對其它的對象則另需一些額外信息攒暇。
2番刊、在文件中讀寫數(shù)據(jù)
函數(shù)read.table用來創(chuàng)建一個數(shù)據(jù)框垄分,所以它是讀取表格形式的數(shù)據(jù)的主要方法。>mydata<-read.table("data.dat")计福。將創(chuàng)建一個數(shù)據(jù)框名為mydata跌捆,數(shù)據(jù)框中每個變量也都將命令。
函數(shù)scan比read.table要更加靈活象颖,它們的區(qū)別之一是前者可以指定變量的類型佩厚。區(qū)別之二是scan()可以用來創(chuàng)建不同的對象,向量力麸、矩陣可款、數(shù)據(jù)框,列表....
3克蚂、存儲數(shù)據(jù)
函數(shù)write.table可以在文件中寫入一個對象闺鲸,一般是寫一個數(shù)據(jù)框,也可以是其它類型的對象(向量埃叭,矩陣)摸恍。若想用更簡單的方法將一個對象寫入文件,可以使用命令write(x,file="data.txt")赤屋,其中x是對象的名字立镶。
4、生成數(shù)據(jù)
1)規(guī)則序列
函數(shù)seq可以生成實數(shù)序列类早。如:>seq(1,5,0.5)媚媒。其中第一個數(shù)字表示序列的起點,第二個表示終點涩僻,第三個是生成序列的步長缭召。還可以用函數(shù)c直接輸入數(shù)值。如:>c(1,1.5,2.0,2.5,6,5)逆日。如果想用鍵盤輸入一些數(shù)據(jù)也是可以以嵌巷,只需要直接使用默認(rèn)選項的scan函數(shù)。如:>z<-scan()室抽。函數(shù)req用來創(chuàng)建一個所有元素都相同的向量搪哪。如:>req(1,30)坪圾。函數(shù)sequence創(chuàng)建一系列連接的整數(shù)序列晓折。每個序列都以給定參數(shù)的數(shù)值結(jié)尾。>sequence(4:5)神年。函數(shù)gl(生成不同的水平/層次數(shù)據(jù))十分有用已维。因為它能產(chǎn)生規(guī)則的因子序列。如:>gl(3,5)
2)隨機序列
在統(tǒng)計學(xué)中已日,產(chǎn)生隨機數(shù)據(jù)是很有用的垛耳,R可以產(chǎn)生多種不同分布下的隨機數(shù)序列。
5飘千、使用對象
1)創(chuàng)建對象
在創(chuàng)建一個對象時有可能指定它的數(shù)據(jù)類型堂鲜,長度、類別等等的护奈。從處理對象的角度時是很有趣的缔莲。舉例來說,我們可以創(chuàng)建一個空的對象并逐步修改其中的元素霉旗。
向量(vector):函數(shù)vector有兩個參數(shù)痴奏。類型和長度蛀骇。創(chuàng)建的向量中元素值取決于參數(shù)所指定的數(shù)據(jù)類型。數(shù)值型向量則元素值都為0读拆,邏輯型都為FALSE擅憔,字符型都為""。
因子(factor):一個因子不僅包括分類變量本身還包括變量不同的可能水平(因為他們在數(shù)據(jù)中不出現(xiàn))檐晕。
矩陣(Matrix):一個矩陣實際上是有一個附加屬性(維數(shù)dim)的向量暑诸,維數(shù)即為一個長度為2的向量,用來指定矩陣的行數(shù)和列數(shù)辟灰。一個矩陣可以用函數(shù)matrix來創(chuàng)建个榕。
數(shù)據(jù)框(Data frame):用函數(shù)data.frame來創(chuàng)建。數(shù)據(jù)框中的向量必須有相同的長度芥喇,如果其中有一個比其它的短西采,它將“循環(huán)”整數(shù)次(以使得其長度與其它向量相同)。
最后:注意數(shù)據(jù)框和矩陣一樣有維數(shù)這個屬性继控。
列表(List):列表可以用list函數(shù)來創(chuàng)建苛让,方法與創(chuàng)建數(shù)據(jù)框類似。它對其中包含的對象沒有什么限制湿诊。
時間序列(Time-series):函數(shù)ts可以由向量(一元時間序列)或者矩陣(多元時間序列)創(chuàng)建一個ts型對象狱杰。并且有一些表明序列特征的選項(帶有缺省值)。
表達式(Espression):表達式類型的對象在R中有著很基礎(chǔ)的地位厅须,是R能夠解釋的字符序列仿畸。隨后用eval()對創(chuàng)建的表達式進行求值。
2)對象的類型轉(zhuǎn)換
as.something這種形式的函數(shù)可以完成轉(zhuǎn)換朗和。as.numeric將轉(zhuǎn)換為數(shù)值型错沽。as.logical將轉(zhuǎn)換為邏輯型。as.character將轉(zhuǎn)換為字符型眶拉。對于一個字符型因子來說是很有意義的千埃。要想將一個數(shù)值型向量并且保持最初指定的水平值,就必須先轉(zhuǎn)換成字符型然后再轉(zhuǎn)換成數(shù)值型忆植。如:as.numeric(as.character(fac))
3)運算符
運算符分為數(shù)學(xué)運算放可、比較運算、邏輯運算朝刊。identical比較數(shù)據(jù)的內(nèi)在關(guān)系耀里,如果對象是嚴(yán)格相同的返回TRUE,否則返回FALSE拾氓。all.equal用來判斷兩個對象是否“近似相等”冯挎,返回結(jié)果為TRUE或者對二者差異的描述。后一個函數(shù)在比較數(shù)值型變量時考慮到了計算過程中的近似咙鞍。在計算機中數(shù)據(jù)變量的比較有時很令人驚奇房官。
4)訪問一個對象的數(shù)值:下標(biāo)系統(tǒng)
下標(biāo)系統(tǒng)可以用來有效趾徽、靈活且有選擇性地訪問一個對象中的元素;下標(biāo)可以是數(shù)值型的或邏輯型的翰守。下標(biāo)本身也可以是一個數(shù)值型向量附较。
如果x是一個矩陣或者數(shù)據(jù)框,第i行第j列的值可以通過x[i,j]來訪問潦俺。要訪問一個給定的行或列所有的值,只要忽略適當(dāng)?shù)南聵?biāo)(不要忘記逗號P觳)
對于列表事示,訪問不同的元素(可以是任何類型的對象)可以通過單一的或者雙重的方括號來實現(xiàn);它們的區(qū)別是:單個括號返回一個列表僻肖,而雙重括號將提取列表中的對象肖爵。如:my.list[1:2]將返回一個列表,包含原始列表的第1個和第2個元素臀脏。而my.list[[1:2]]不會給出期望的結(jié)果劝堪。
5)訪問對象的名稱
names是一個和對象有同樣長度的向量并且可以通過函數(shù)names來訪問。如果一個對象的元素有名稱揉稚,它們可以通過名稱被提取秒啦,和使用一樣。實際上搀玖,因為原始對象的屬性將被保留余境,所以這里的“提取”應(yīng)該叫作“取子集”更合適。如果列表中的對象有名稱灌诅,這種方法也將在列表中起作用芳来。
6)數(shù)據(jù)編輯器
我們可以使用一個類似于電子表格的圖形編輯器去編輯一個“數(shù)據(jù)”對象。例如猜拾,如果X是一個矩陣即舌,命令data.entry(X)將打開一個圖形編輯器并且可以通過點擊適當(dāng)?shù)膯卧裥薷臄?shù)值或者添加新的行或列。
7)數(shù)學(xué)運算和一些簡單的函數(shù)
在R中有很多用來處理數(shù)據(jù)的函數(shù)挎袜,前面我們已經(jīng)看到了最簡單的一個函數(shù)c顽聂,它用來連接列在圓括號中的對象。
8)矩陣運算
R中有矩陣計算和處理的工具盯仪,函數(shù)rbind()和cbind()分別用上下或左右的方式合并向量或矩陣芜飘。
兩矩陣乘積的運算符是“%*%”。矩陣的轉(zhuǎn)置由函數(shù)t完成磨总,這個函數(shù)也可以作用于數(shù)據(jù)框嗦明。函數(shù)diag可以用來提取或修正一個矩陣的對象元,或者創(chuàng)建一個對象矩陣蚪燕。R中也有一些用于矩陣計算的專門的函數(shù)娶牌。我們可以使用solve來矩陣的逆奔浅,用qr來分解矩陣,用eigen來計算特征值和特征向量诗良,用svd來做奇異值分解汹桦。
第四章 R繪圖
繪圖函數(shù)的工作方式與文本前面描述的工作方式為不同,不能把繪圖函數(shù)的結(jié)果賦給一個對象鉴裹,其結(jié)果直接輸出到一個繪圖設(shè)備上舞骆。繪圖設(shè)備是一個繪圖的窗口或是一個文件。
1径荔、管理繪圖
1)打開多個繪圖設(shè)備:當(dāng)繪圖函數(shù)開始執(zhí)行督禽,如果沒有打開繪圖設(shè)備,那么R將打開一個繪圖窗口來展示這個圖形总处。繪圖設(shè)備可以用適當(dāng)?shù)暮瘮?shù)打開狈惫。可用的繪圖設(shè)備種類取決于操作系統(tǒng)鹦马。在Unix/Linux下胧谈,繪圖窗口稱為xl1,而在windows下稱為windows荸频。在所有情況下菱肖,都可以用命令xl1()來打開一個繪圖窗口。最后打開的設(shè)備將成為當(dāng)前的繪圖設(shè)備旭从,隨后的所有圖形都在這上面顯示蔑滓。
顯示的數(shù)字是設(shè)備的編號,要改變當(dāng)前設(shè)備必須使用這些編號遇绞,為了解當(dāng)前設(shè)備用键袱。dev.list()顯示所有設(shè)備;dev.cur()顯示當(dāng)前設(shè)備摹闽;dev.set()改變當(dāng)前設(shè)備蹄咖;dev.off()關(guān)閉一個設(shè)備。
2)圖形的分割
函數(shù)split.screen()分割當(dāng)前的繪圖設(shè)備付鹿。erase.screen()刪除最后繪制的圖形澜汤。函數(shù)layout把當(dāng)前的圖形窗口分割為多個部分,圖形將一次顯示在各部分中舵匾,它主要的自變量是一個元素都是整數(shù)值的矩陣俊抵,元素指示子窗口的編號。
2坐梯、繪圖函數(shù)/繪圖函數(shù)
第五章 R的統(tǒng)計分析
包stats包括一系列基本的統(tǒng)計分析函數(shù)徽诲;經(jīng)典的假設(shè)檢驗,線性模型(包括最小二乘法回歸,廣義線性模型谎替,和方差分析)偷溺,統(tǒng)計分布,匯總統(tǒng)計钱贯,層次聚類挫掏,時間序列分析,非線性最小二乘法和多元分析秩命。其他的R包還提供了一些上述統(tǒng)計方法以外的統(tǒng)計方法尉共。
1、關(guān)于方差的一個簡單例子
在包stats里面的方差分析函數(shù)是aov弃锐。通過函數(shù)data把數(shù)據(jù)導(dǎo)入內(nèi)存后袄友,首先對數(shù)據(jù)進行平方根轉(zhuǎn)換。然后再進行分析拿愧。前面腳本運行的結(jié)果不會在屏幕上顯示,因為它們都被賦給對象aov.spray碌尔。函數(shù)plot()和termplot()展示分析結(jié)果的統(tǒng)計圖浇辜。
2、泛型函數(shù)
和許多統(tǒng)計編程語言不同的是唾戚,R函數(shù)將輸入對象的屬性作為輸入?yún)?shù)柳洋。類是最應(yīng)該注意關(guān)注的一個屬性。R統(tǒng)計函數(shù)常常返回一個類名與函數(shù)名相同的對象叹坦。我們用來解析結(jié)果的函數(shù)對特定的類對象有特定的行為熊镣。這些函數(shù)被稱為泛型。泛型函數(shù)很少對對象進行任何操作:它們調(diào)用自變量所屬類的對應(yīng)函數(shù)募书。
3绪囱、包
隨R基本安裝環(huán)境發(fā)布的標(biāo)準(zhǔn)包。其中一些包在R啟動時就直接調(diào)入內(nèi)存莹捡;這些可用通過函數(shù)search顯示鬼吵。其他包需要載入后才能使用。
第六章 R編程實踐
1篮赢、相比下拉菜單式的程序齿椅,R的一個優(yōu)勢在于它可以把一系列連接的操作簡單的程序化。這一點上和所有其他計算機編程語言是一致的启泣,但R有一些特性使得非專業(yè)人士也可以很簡單的編程程序涣脚。
2、用R寫和程序
一般情況下寥茫,一個R程序以ASCII格式保存遣蚀,擴展名為‘.R’。如果一個工作要重復(fù)好多次,用R程序是一個不錯的選擇妙同。
3射富、編寫你自己的函數(shù)
大多數(shù)R的工作是通過函數(shù)來實現(xiàn),而且這些函數(shù)的輸入?yún)?shù)都放在一個括弧里粥帚。用戶可以編寫他們自己的函數(shù)胰耗,并且這些函數(shù)和R里面的其他函數(shù)有一樣的特性。編寫自己的函數(shù)可以讓你有效的芒涡,靈活的與合理的使用R柴灯。