《R語言編程指南與使用手冊.doc》由會員分享,可在線閱讀,更多相關《R語言編程指南與使用手冊.doc(30頁珍藏版)》請在裝配圖網上搜索。
第 30 頁 共 30 頁
R語言編程指南與使用手冊
開源中國社區(qū) 2016-03-18
R語言編程指南與使用手冊
在R的官方教程里是這么給R下注解的:一個數(shù)據分析和圖形顯示的程序設計環(huán)境(A system for?data analysis and visualization which is built based on S language.)。
R的源起
R是S語言的一種實現(xiàn)。S語言是由 AT&T貝爾實驗室開發(fā)的一種用來進行數(shù)據探索、統(tǒng)計分析、作圖的解釋型語言。最初S語言的實現(xiàn)版本主要是S-PLUS。S-PLUS是一個商業(yè) 軟件,它基于S語言,并由MathSoft公司的統(tǒng)計科學部進一步完善。后來Auckland大學的Robert Gentleman 和 Ross Ihaka 及其他志愿人員開發(fā)了一個R系統(tǒng)。R的使用與S-PLUS有很多類似之處,兩個軟件有一定的兼容性。
R is free
R是用于統(tǒng)計分析、繪圖的語言和操作環(huán)境。R是屬于GNU系統(tǒng)的一個自由、免費、源代碼開放的軟件,它是一個用于統(tǒng)計計算和統(tǒng)計制圖的優(yōu)秀工具。
R是一套完整的數(shù)據處理、計算和制圖軟件系統(tǒng)。其功能包括:數(shù)據存儲和處理系統(tǒng);數(shù)組運算工具(其向量、矩陣運算方面功能尤其強大);完整連貫的統(tǒng)計分析工具;優(yōu)秀的統(tǒng)計制圖功能;簡便而強大的編程語言:可操縱數(shù)據的輸入和輸入,可實現(xiàn)分支、循環(huán),用戶可自定義功能。
R是一個免費的自由軟件,它有UNIX、LINUX、MacOS和WINDOWS版本,都是可以免費下載和使用的,在那兒可以下載到R的安裝程序、各種外掛程序和文檔。在R的安裝程序中只包含了8個基礎模塊,其他外在模塊可以通過CRAN獲得。
R的特點
(1) 有效的數(shù)據處理和保存機制。
(2) 擁有一整套數(shù)組和矩陣的操作運算符。
(3) 一系列連貫而又完整的數(shù)據分析中間工具。
(4) 圖形統(tǒng)計可以對數(shù)據直接進行分析和顯示,可用于多種圖形設備。
(5) 一種相當完善、簡潔和高效的程序設計語言。它包括條件語句、循環(huán)語句、用戶自定義的遞歸函數(shù)以及輸入輸出接口。
(6) R語言是徹底面向對象的統(tǒng)計編程語言。
(7) R語言和其它編程語言、數(shù)據庫之間有很好的接口。
(8) R語言是自由軟件,可以放心大膽地使用,但其功能卻不比任何其它同類軟件差。
(9) R語言具有豐富的網上資源
一 ? 入門訓練
1. 獲取幫助
? ??> help.start() 開啟幫助文檔
? ? > help(solve) 顯示某命令的幫助信息,或者
? ? > ?solve
? ??對于由特殊字符指定的功能,這些參數(shù)必須用單引號或雙引號括起來,使之成為一個“字符串”,如
? ? > help("[[")
? ??與某個主題相關的例子通常可以用下面的命令得到
? ? >?example(topic)
2. 命令簡介
? ? R對大小寫是敏感的;名稱不能以數(shù)字開始;
? ? 基本的命令由表達式或者賦值語句組成。如果一個表達式被作為一條命令給出,它將被求值、打印而表達式的值并不被保存。一個賦值語句同樣對表達式求值之后把表達式的值傳給一個變量,不過并不會自動的被打印出來;
? ? 命令由分號(;)來分隔,或者另起新行;
? ? 基本命令可以由花括號(f和g)合并為一組復合表達式;
? ? 注釋幾乎可以被放在任何地方,只要是以井號( # )開始,到行末結束;
? ? 如果一個命令在行莫仍沒有結束,R將會給出一個不同的提示符,默認的是‘+’。
?
3. 命令文件的執(zhí)行和輸出轉向到文件
如果命令存儲于一個外部文件中,比如工作目錄work中的commands.R,他們可以隨時在R的任務中被執(zhí)行
>?source("commands.R")在Windows中Source也可以由File菜單執(zhí)行。
函數(shù)sink,
>?sink("record.lis")
將把所有后續(xù)的輸出由終端轉向一個外部文件,record.lis。命令
> sink() ??將把信息重新恢復到終端上。
4. 數(shù)據的保持與對象的清除
R所創(chuàng)建、操作的實體是對象。對象可以是變量、數(shù)組、字符串、函數(shù)以及由這些元素組成的其它結構;
>?objects() ? ??用來顯示目前存儲在R中的對象的名字。而當前存儲的所有對象的組合被稱為workspace;
清除對象可以使用rm命令:
>?rm(x, y, z, ink, junk, temp, foo, bar)
所有在一個R任務中被創(chuàng)建的對象都可以在文件中被永久保存,并在其它的R任務中被使用。在每個R任務結束時用戶都有機會保存當前有效的所有對象。如果用戶這樣做的話,對象將被寫入當前目錄一個名為.RData。當R被再次啟動時R會從這個文件中再載入workspace。同時相關的命令記錄也被載入。
所以,推薦大家在用R進行不同的分析時分別使用不同的工作目錄。
5. 基本數(shù)據結構
?
數(shù)值型(numeric)
?
1,1.2,3.1415926
復數(shù)型(complex)
1+2i
字符型(character)
‘A’/ “hello world!”
邏輯型(logical)
TRUE / FALSE
6. 基本數(shù)據對象
?
向量(vector), 見下節(jié)
矩陣(matrix):?
更一般的說數(shù)組是向量在多維情況下的一般形式。事實上它們是可以被兩個或更多的指標索引的向量,并且以特定的方式被打印出來。
因子(factors)?提供了一種處理分類數(shù)據的更簡介的方式。
列表(list): ?
是向量的一種一般形式,并不需要保證其中的元素都是相同的類型,而且其中的元素經常是向量和列表本身。
數(shù)據框(data frame):
是一種與矩陣相似的結構,其中的列可以是不同的數(shù)據類型??梢园褦?shù)據框看作一種數(shù)據"矩陣",它的每行是一個觀測單位,而且(可能)同時包含數(shù)值型和分類的變量。
函數(shù)( function):
能夠在R的workspace中存儲的對象。我們可以通過函數(shù)來擴展R的功能。
二 ? 簡單操作,數(shù)值與向量
2.1 向量與賦值
R對命名了的數(shù)據結構進行操作。最簡單的數(shù)據結構是數(shù)字向量;如,
> x <- c(10.4, 5.6, 3.1, 6.4, 21.7) ? ?c()是創(chuàng)建函數(shù),賦值運算符是'<-',與函數(shù)assign()等價
>?assign("x", c(10.4, 5.6, 3.1, 6.4, 21.7)) ?也可以寫成:
>?c(10.4, 5.6, 3.1, 6.4, 21.7) -> x
如果一個表達式被當作一個完整的命令,它的值將被打印到終端但不被儲存。
單獨輸入x則會將值打印出來。也可以打印倒數(shù):
> 1/x
> y <- c(x, 0, x) ? 也可以將向量作為元素。
2.2 向量運算
? ? 操作是按照向量中的元素一個一個進行的。同一個表達式中的向量并不需要具有相同的長度。如果它們的長度不同,表達式的結果是一個與表達式中最長向量有相同長度的向量。表達式中較短的向量會根據它的長度被重復使用若干次(不一定是整數(shù)次),直到與長度最長的向量相匹配。而常數(shù)很明顯的將被不斷重復。如,
> v <- 2*x + y + 1
常用運算有:
+,-,*,/,^(次方);
log, exp, sin, cos, tan,sqrt等;
max和min的作用是選出所給向量中最大的或最小的元素;
range函數(shù)的值是一個長度為2的向量,即c(min(x),max(x))
length(x)返回了向量x中元素的個數(shù),也就是x的長度。
sum(x)給出了x中所有元素的總和;
prod(x)給出x中所有元素的乘積;
mean(x)和var(x),分別計算樣本均值和樣本方差,這兩個函數(shù)分別相當于sum(x)/length(x),sum((x-mean(x)) \^2)/(length(x) -1)。如果var()的參數(shù)是一個n*p的矩陣,那么函數(shù)的值是一個p*p的樣本協(xié)方差矩陣,認為每行是一個p變量的樣本向量。
sort(x)返回一個與x具有相同長度的向量,其中的元素按招升序排列。還有其他更靈活的排序功能(參見order()和sort.list())。
pmax和pmin將返回一個與最長的向量長度相等的向量,向量中的元素由參數(shù)中所有向量在相應位置的最大值(最小值)組成;
如果要使用復數(shù),需要直接給出一個復數(shù)部分。因此sqrt(-17)將會返回NaN(無效數(shù)值)和一個警告,而sqrt(-17+0i)將按照復數(shù)進行運算。
2.3 生成序列
最簡單的方法是用冒號‘:’,冒號具有最高運算優(yōu)先級。例如1:30就是向量c(1,2,. . .,29,30)。30:1構造一個遞減序列。
利用seq()函數(shù)構造序列:有五個參數(shù),from, to, by, length, along
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?from, to可以不寫參數(shù)名,seq(2,10)就相當于2:10。
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?by指定步長,默認為1,如seq(-5, 5, by=.2)即為c(-5.0, -4.8, -4.6, ..., 4.6, 4.8, 5.0)
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?length指定序列長度,如seq(length=51, from=-5, by=.2),等同于seq(-5, 5, by=.2)
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?along=vector只能單獨使用,產生一個“1:length(vector)”序列。類似的函數(shù)是rep(),這個函數(shù)可以用多種復雜的方法來 ? ? ? ? ? ? ? ? ? ? ? ? ?
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?復制一個對象。最簡單的形式是> s5 <- rep(x, times=5)
2.4 邏輯向量
?
TRUE,?FALSE, 和NA(not available), 前兩個可以簡寫為T和F,但T/F并不是系統(tǒng)保留字,可以被用戶覆蓋,所以最好還是不要簡寫。
邏輯向量是由條件給出的,如下列語句令temp成為一個與x長度相同,相應位置根據是否與條件相符而由TRUE或FALSE組成的向量:
> temp <- x > 13
邏輯操作符包括<, <=, >, >=,完全相等==和不等于!=,與或非分別為&, |, !。
在普通運算中,F(xiàn)ALSE當做0而TRUE當做1。
2.5 缺失值
NA(not available):?一般來講一個NA的任何操作都將返回NA。
? ? ?is.na(x)返回一個與x等長的邏輯向量,并且由相應位置的元素是否是NA來決定這個邏輯向量相應位置的元素是TRUE還是FALSE。
? ? ?x==NA是一個與x具有相同長度而其所有元素都是NA的向量。
NaN(Not a Number):?由數(shù)值運算產生,如0/0, Inf-Inf.
? ? ?is.na(x)對于NA和NaN值都返回TRUE,
? ? ?is.nan(x)只對NaN值返回TRUE。
2.6 字符向量
?
字符串在輸入時可以使用單引號(')或雙以號("); ?在打印時用雙引號(有時不用引號)。
R使用與C語言風格基本相同的轉義符,?所以輸入\\打印的也是\\, 輸入\" 打印引號", ?\n: 換行, \t: tab, \b: 回格。
字符向量可以通過函數(shù)c()連接;
paste()可以接受任意個參數(shù),并從它們中逐個取出字符并連成字符串,形成的字符串的個數(shù)與參數(shù)中最長字符串的長度相同。如果參數(shù)中包含數(shù)字的話,數(shù)字將被強制轉化為字符串。在默認情況下,參數(shù)中的各字符串是被一個空格分隔的,不過通過參數(shù)sep=string 用戶可以把它更改為其他字符串,包括空字符串。例如:
> labs <- paste(c("X","Y"), 1:10, sep="") ?使變量labs成為字符變量c("X1", "Y2", "X3", "Y4", "X5", "Y6", "X7", "Y8", "X9", "Y10")
2.7 index vector---數(shù)據集子集的選擇與修改
?
任何結果為一個向量的表達式都可以通過追加索引向量(index vector)來選擇其中的子集。
1 邏輯的向量。
> y <- x[!is.na(x)] ? ?表示將向量x中的非NA元素賦給y;
> (x+1)[(!is.na(x)) & x>0] -> z ? ? 表示創(chuàng)建一個對象z,其中的元素由向量x+1中與x中的非缺失值和正數(shù)對應的向量組成。
2. 正整數(shù)的向量
> x[6] ? ?是x的第六個元素
> x[1:10] ? ? ??選取了x的前10個元素(假設x的長度不小于10)。
> c("x","y")[rep(c(1,2,2,1), times=4)] ? ??產生了一個字符向量,長度為16,由"x", "y", "y", "x"重復4次而組成。
3. 負整數(shù)的向量
> y <- x[-(1:5)] ? ? ? 表示向量y取向量x前5個元素以外的元素。
4. 字符串的向量
只存在于擁有names屬性并由它來區(qū)分向量中元素的向量。這種情況下一個由名稱組成的子向量起到了和正整數(shù)的索引向量相同的效果。
> fruit <- c(5, 10, 1, 20)
> names(fruit) <- c("orange", "banana", "apple", "peach")
> lunch <- fruit[c("apple","orange")]
子集的修改
> x[is.na(x)] <- 0 ? ?表示將向量x中所以NA元素用0來代替
> y[y < 0] <- -y[y < 0] ? ? ?表示將向量(-y)中 與向量y的負元素對應位置的元素 賦值給 向量y中 與向量y負元素對應的元素。作用相當于:
> y <- abs(y)
三 ?對象,模式和屬性
3.1 固有屬性:模式和長度
對象是R所進行操作的實體,對象可以是向量、列表等,詳見1.6.
對象的模式包括numeri,ccomplex,character,logical,list,function,expression等。可以用mode(object)查看。
對象的長度是對象的另一固有屬性??梢杂胠ength(object)查看。
attribute(object)可以查看更深入的屬性。
模式的轉換
在允許的情況下(大多數(shù)情況都是允許的),R可以完成各種模式的轉換。例如:d<-as.character(z),將數(shù)值向量z<-(0:9)轉化為字符向量c("0", "1", "2", ..., "9")。as.integer(d)將d轉化為數(shù)值向量。
R中很多形式為as.something()的函數(shù),可以完成從一個模式向另一個模式的轉化,或者是令對象取得它當前模式不具有的某些屬性。
3.2 改變對象的長度
> e <-?numeric()?? ?產生一個numeric型的空向量e。character()等類似。此時長度為對象0。
此時新添加一個元素會使e的長度自動調整。
> e[3] <- 17 ? ?令e為一個長度為3的向量(此時,該向量的前兩個元素都是NA)
縮短(截斷)一個對象的長度,只需要一個賦值命令。因此,若alpha是一個長度為10的對象,下面的命令
> alpha <- alpha[2 * 1:5]
3.3 屬性的獲取和設置
?
函數(shù)attributes(object)將給出當前對象所具有的所有非基本屬性(長度和模式屬于基本屬性)的一個列表。
函數(shù)attr(object,name)可以被用來選取一個指定的屬性。除了為某些特殊的目的創(chuàng)建新屬性這樣特殊的環(huán)境下,這些函數(shù)很少被用到。
當函數(shù)attr()用在賦值語句左側時,既可以是將對象與一種新的屬性關聯(lián),也可以是對原有屬性的更改。例如
> attr(z,"dim") <- c(10,10) ? ? ? ??另R將z作為一個10X10的矩陣看待。
3.4 對象的類別
對象的一個特別屬性,類別,被用來指定對象在R編程中的風格。比如:如果對象類別"data.frame"則會以特定方式處理。
unclass()可以去除對象的類別。
summary()可以查看對象的基本信息(min, max, mean, etc.)
四 ?有序因子和無序因子
?
因子是一種向量對象,它給自己的組件指定了一個離散的分類(分組),它的組件由其他等長的向量組成。R提供了有序因子和無序因子。
通俗點說,因子就是將對象的值分成不同的組(levels)。
用函數(shù)factor()創(chuàng)建一個因子,levels按序排列(字母序或數(shù)值序)。
例如province<-c("四川","湖南","江蘇","四川","四川","四川","湖南","江蘇","湖南","江蘇"),為province創(chuàng)建因子:
>?pf<-factor(province) ? 創(chuàng)建province的因子pf
> pf ? ? 打印出來
?[1] 四川 湖南 江蘇 四川 四川 四川 湖南 江蘇 湖南 江蘇
Levels: 湖南 江蘇 四川
函數(shù)levels()可以用來觀察因子中有多少不同的levels。
假如我們擁有這些省份考生的分數(shù):
> score<-c(95,86,84,92,84,79,86,99,85,90)
函數(shù)tappley()可以用來計算各省的平均分數(shù),函數(shù)tapply()的作用是對它第一個參數(shù)的組件中所包含的每個組應用一個參數(shù)三指定的函數(shù)。
> smeans<-tapply(score,pf,mean)
> smeans
? ? 湖南 ? ? 江蘇 ? ? 四川?
85.66667 91.00000 87.50000?
再例如,下面命令會給出各組的length
> tapply(score,pf,length)
湖南 江蘇 四川?
? ?3 ? ?3 ? ?4?
?
函數(shù)ordered()可以創(chuàng)建有序因子
> ordered(province)
?[1] 四川 湖南 江蘇 四川 四川 四川 湖南 江蘇 湖南 江蘇
Levels: 湖南 < 江蘇 < 四川
?
五 數(shù)組和矩陣
5.1 數(shù)組
數(shù)組可以看成一個由遞增下標表示的數(shù)據項的集合,例如數(shù)值。
數(shù)組的生成
如果一個向量需要在R中以數(shù)組的方式被處理,則必須含有一個維數(shù)向量作為它的dim屬性。
維度向量由dim()指定,例如,z是一個由1500個元素組成的向量。下面的賦值語句
> dim(z) <- c(3,5,100) ? ? ? ?使它具有dim屬性,并且將被當作一個3X5X100的數(shù)組進行處理。 c(3,5,100)?就是他的維度向量。
還可以用到像matrix()和array()這樣的函數(shù)來賦值。比如
>?array(1:20, dim=c(4,5))
> matrix(1:24, 3,4)
數(shù)據向量中的值被賦給數(shù)組中的值時,將遵循與FORTRAN相同的原則"主列順序",即第一個下標變化的最快,最后的下標變化最慢。
數(shù)組的運算
數(shù)組可以在算數(shù)表達式中使用,結果也是一個數(shù)組,這個數(shù)組由數(shù)據向量逐個元素的運算后組成,通常參與運算的對象應當具有相同的dim屬性。
5.2 數(shù)組的索引和數(shù)組的子塊
?
數(shù)組中的單個元素可以通過下標來指定,下標由逗號分隔,寫在括號內。
我們可以通過在下標的位置給出一個索引向量來指定一個數(shù)組的子塊,不過如果在任何一個索引位置上給出空的索引向量,則相當于選取了這個下標的全部范圍。
如a[2,,],a[,3,]等
5.3 索引數(shù)組
除了索引向量,還可以使用索引數(shù)組來指定數(shù)組的某些元素。
例如:有4X5的數(shù)組a,若要得到a中的a[1,3], a[2,2] 和a[3,1]這三個元素,可以生成索引向量i,然后用a[i]得到它們。
>?a <- array(1:20,dim=c(4,5)) # Generate a 4 by 5 array.
> i <- array(c(1:3,3:1),dim=c(3,2))
> i
[,1] [,2]
[1,] 1 3
[2,] 2 2
[3,] 3 1
> a[i]
[1] 9 6 3
> a[i] <- 0 ? # 將這三個元素用0替換。
5.4 向量,數(shù)組的混合運算
表達式從左到右被掃描;
參與運算的任意對象如果大小不足,都將被重復使用直到與其他參與運算的對象等長;
當較短的向量和數(shù)組在運算中相遇時,所有的數(shù)組必須具有相同的dim屬性,否則返回一個錯誤;
如果有任意參與運算的向量比參與運算的矩陣或數(shù)組長,將會產生錯誤;
如果數(shù)組結構正常聲稱,并且沒有錯誤或者強制轉換被應用于向量上,那么得到的結果與參與運算的數(shù)組具有相同的dim屬性。
5.5 矩陣的運算
構建分區(qū)矩陣:cbind()和rbind(),cbind()按照水平方向,或者說按列的方式將矩陣連接到一起。rbind()按照垂直的方向,或者說按行的方式將矩陣連接到一起。
?
外積:操作符是%o%:
> ab <- a %o% b ??或者
> ab <-?outer(a, b, "*")
其中的乘法操作可以由任意一個雙變量的函數(shù)替代。
廣義轉置:函數(shù)t(A),或aperm(A, c(2,1));
獲取行數(shù)/列數(shù):nrow(A)和ncol(A)分別返回矩陣A的行數(shù)和列數(shù)。
矩陣乘法:操作符為%*%;
交叉乘積(cross product):crossprod(X,Y)等同于t(X) %*% y,crossprod(X)等價于crossprod(X, X);
diag(v):如果v是向量,diag(v)返回一個由v的元素為對角元素的對角矩陣。
? ? ? ? ? ? ? ?如果v為矩陣,diag(v)返回一個由v主對角元素組成的向量。
? ? ? ? ? ? ? ?如果v只是一個數(shù)值,那么diag(v)是一個vXv的單位矩陣。
?
特征值和特征向量:eigen(Sm)。這個函數(shù)的結果是由名為values和vectors的兩部分組成的列表。如果只是需要特征值:eigen(Sm)$values
最小二乘擬合即QR分解:lsfit(), qr()。
強制轉換為向量:as.vector(),或者直接c().
解線性方程和求矩陣的逆,奇異值分解與行列式見
;
六 ?列表和數(shù)據幀
6.1 列表
列表是由稱作組件的有序對象集合構成的對象。組件的模式或類型不一定相同。
形如Lst <-?list(name_1=object_1, . . ., name_m=object_m)的賦值將創(chuàng)建一個包含m個組件的列表,并根據參數(shù)中指定的名稱為其命名。(其名稱可以自由選取)。如果它們的名稱被省略,組件將只是被編號。例如:
> Lst <-?list(name="Fred", wife="Mary", no.children=3,child.ages=c(4,7,9))
所使用的組件是被復制到新的列表中的,對原始對象沒有影響。
組件總是被編號的,并且可以通過編號指定。
Lst[[1]]?即為"Fred",也可以用?Lst$name,Lst[["name"]]指定。如果Lst[[4]]是一個有下標的數(shù)組,Lst[[4]][1]就是它的第一項。
區(qū)分Lst[[1]]和Lst[1],'[[...]]'是選擇單個元素時使用的操作符,而'[...]'是一個一般的下標操作符。因此,前者代表列表Lst中的第一個對象;后者是列表Lst的子列表,僅包含列表的第一項。
組件的名稱可以縮寫,可縮寫的程度是只要能令組件被唯一的識別就可以了。如:Lst$na等價于Lst$name,?Lst$w等價于Lst$wife。
擴展列表
可以通過指定額外組件的方式。例如
> Lst[5] <- list(matrix=Mat)
連接列表
當連接函數(shù)c()的參數(shù)為列表時,其結果也是一個模式為列表的對象。由參數(shù)中的列表作為組件依次連接而成。
> list.ABC <- c(list.A, list.B, list.C)
6.2 數(shù)據幀
?
數(shù)據幀是類別為"data.frame"的列表;
數(shù)據幀會被當作各列具有不同模式和屬性的矩陣。
數(shù)據幀按照矩陣的方式顯示,選取的行或列也按照矩陣的方式來索引。
創(chuàng)建數(shù)據幀
直接創(chuàng)建:那些滿足對數(shù)據幀的列(組件)限制的對象可以通過函數(shù)data.frame來構建成為一個數(shù)據幀
> t <- data.frame(home=statef, loot=income, shot=incomef)
強制轉換:如果一個列表的組件與數(shù)據幀的限制一致,這個列表就可以通過函數(shù)as.data.frame()強制轉化為一個數(shù)據幀。
外部文件:創(chuàng)建數(shù)據幀最簡單的方法應當是使用read.table()函數(shù)從外部文件中讀取整個數(shù)據幀。
數(shù)據幀和列表的限制
1 組件必須是向量(數(shù)值型,字符形,邏輯型),因子,數(shù)值矩陣,列表,或其他數(shù)據幀;
2 矩陣,列表,數(shù)據幀向新數(shù)據幀提供的變量數(shù)分別等于它們的列數(shù),元素數(shù)和變量數(shù);
3 數(shù)值向量,邏輯值和因子在數(shù)據幀中保持不變,字符向量將被強制轉化為因子,其水平是字符向量中所出現(xiàn)的值;
4 數(shù)據幀中作為變量的向量結構必須具有相同的長度,而矩陣結構應當具有相同的行大小。
?
掛接和卸載數(shù)據幀
當覺得使用'$'引用數(shù)據幀元素(如't$home')麻煩時,可以進行數(shù)據幀掛接
>?attach(t)?? ? ?這樣可以直接引用數(shù)據幀內的元素,而無需'$',前提是數(shù)據幀外沒有同名的變量(如name)。
掛接后若要對數(shù)據幀元素進行賦值操作,仍需用'$',否則視為賦值給數(shù)據幀外的元素。
賦值后必須要先卸載(detach)再重新掛接后,新值才可見。
>?detach(t)
?
attach()是具有一般性的函數(shù),即它不僅能夠將目錄和數(shù)據幀掛接在搜索路徑上,還能掛接其他類別的對象。特別是模式為"list"的對象可以通過相同的方式掛接:
> attach(any.old.list) ? ??
任何被掛接的對象都可以用detach來卸載,通過指定位置編號或者指定名稱這樣的方式.
搜索路徑
函數(shù)search()將顯示目前的搜索路徑,可以用來查看數(shù)據幀/列表的掛接狀態(tài)。
ls()(或objects())命令可以用來檢查搜索路徑任意位置上的內容。如:ls(), ls(2), ls(t)
R可以在搜索路徑中包含至多20個項目,列表和數(shù)據幀只能在位置2或更靠后的位置上掛接。
?
數(shù)據幀使用慣例
?
1 將每個獨立的,適當定義的問題所包含的所有變量收入同一個數(shù)據幀中,并賦予合適的、易理解、易辨識的名稱;
2 處理問題時,當相應的數(shù)據幀掛接于位置2,同時在第1層工作目錄下存放操作的數(shù)值和臨時變量;
3 在結束一次工作之前,將你認為對將來有參考價值的變量通過$標記的形式添加到數(shù)據幀里面,然后detach();
4 最后,將工作目錄下所有不需要的變量剔除,并且盡量將剩下多余的臨時變量都清除干凈。
這樣我們可以很簡單的在同一個目錄下處理多個問題,而且對每個問題都可以使用x,y,z這樣的變量名。
七 ?從文件中讀取數(shù)據
7.1 函數(shù)read.table()
該函數(shù)可以直接將文件中完整的數(shù)據幀讀入。此時文件要符合特定的格式:
1 第一行應當提供數(shù)據幀中每個變量的名稱;
2 每一行(除變量名稱行)應包含一個行標號和各變量的值。
3 若沒有表頭(變量名稱行),也沒有行標號,只有變量值,則默認變量名稱為"v1","v2"...
4 若有表頭,但沒有行標號,則可以指定參數(shù)header=TRUE.
7.2 函數(shù)scan()
該函數(shù)從鍵盤或文件中讀取數(shù)據,并存入向量或列表中。
> inp <-?scan(file, what)
第一個參數(shù)是文件名,如“test.txt”,若為“”或空,則從鍵盤讀入數(shù)據;
第二個參數(shù)用于確定讀入數(shù)據的模式。 ?如:list("",0,0)?指定讀入到列表中,列表有三項,且列表第一項是字符型,第二三項是數(shù)值型。若為0,則指定讀入到一個數(shù)值向量中,若為“”則指定讀入到字符向量中。
7.3 內置數(shù)據集的讀取
?
R本身提供超過50個數(shù)據集,同時在功能包(包括標準功能包)中附帶更多的數(shù)據集。與S-Plus不同,這些數(shù)據即必須通過data函數(shù)載入。
>?data() ? #獲得基本系統(tǒng)提供的數(shù)據集列表,然后通過形如
>?data(infert) ? ?#來載入名為infert的數(shù)據集
從其他package中載入數(shù)據集
data(package="nls") ? ? ?#查看nls中數(shù)據集
data(Puromycin, package="nls") ? ? #讀取nls中Puromycin數(shù)據集。
用library()掛接package后,它的數(shù)據集也自動包含到搜索路徑中了。
library(nls) ? ?#載入package nls
data() ? ? ?#查看數(shù)據集
date(Puromycin) ? ?#載入Puromycin數(shù)據集
?
7.4 ?編輯數(shù)據
在使用一個數(shù)據幀或矩陣時,edit提供一個獨立的工作表式編輯環(huán)境。
> xnew <- edit(xold) ? ? ? #對數(shù)據集xold進行編輯。并在完成時將改動后的對象賦值給xnew
> xnew <- edit(data.frame()) ? ? ? ?#可以通過工作表界面錄入新數(shù)據。
fix()函數(shù)用于直接修改已有的對象,等價于 ?x<-edit(x).
八 概率分布
8.1 R是一個統(tǒng)計表集合(略讀)
?
R提供了一套完整的統(tǒng)計表集合。函數(shù)可以對累積分布函數(shù)P(X<=x),概率密度函數(shù),分位函數(shù)(對給定的q,求滿足P(X<=x) > q的最小x)求值,并根據分布進行模擬。
對于所給的名稱,加前綴'd'代表密度(density),'p'代表CDF,'q'代表分位函數(shù),'r'代表模擬(隨即散布)。這幾類函數(shù)的第一個參數(shù)是有規(guī)律的,形為dxxx的函數(shù)為x,pxxx的函數(shù)為q,qxxx的函數(shù)為p,rxxx的函數(shù)為n(rhyper和rwilcox是特例,他們的第一個參數(shù)為nn)。目前為止,非中心參數(shù)(non-centrality parameter)僅對CDF和少數(shù)幾個其他函數(shù)有效,細節(jié)請參考在線幫助。
所有pxxx和qxxx的函數(shù)都具有邏輯參數(shù)lower.tail和log.p,而所有的dxxx函數(shù)都有參數(shù)log,這個是我們可以直接通過
- pxxx(t, ..., lower.tail = FALSE, log.p = TRUE)
獲取,比如說,累積失效函數(shù)(cumulative/integrated hazard function),H(t) =-log(1-F(t)),以及更精確的對數(shù)似然(通過dxxx(..., log = TRUE))。
此外,對于來自正態(tài)分布,具有學生化樣本區(qū)間的分布還有ptukey和qtukey這樣的函數(shù)。下面是一些例子
> ## 2-tailed p-value for t distribution
> 2*pt(-2.43, df = 13)
> ## upper 1% point for an F(2, 7) distribution
> qf(0.99, 2, 7)
8.2 檢測數(shù)據集的分布
?
函數(shù)summary和fivenum這兩個函數(shù)可以給出摘要,后者只給出數(shù)值;
函數(shù)stem可以將數(shù)值統(tǒng)計結果以類似直方圖的方式顯示出來;
函數(shù)hist()可以繪制直方圖;
函數(shù)density和line可以獲得更漂亮的密度圖;
功能包fun中的ecdf函數(shù)能繪制經驗累積分布函數(shù);
還可以進行擬合正態(tài)分布,覆蓋擬合CDF;
還可以繪制Quantile-quantile?(Q-Q)圖有助于我們更細致的檢測其分布形態(tài);
8.3 單樣本和兩樣本檢驗(略讀)
九 ?語句組、循環(huán)和條件操作
?
R是一種表達式語言,也就是說其命令類型只有函數(shù)或表達式,并由它們返回一個結果。
語句組由花括號‘{ }’確定,此時結果是該組中最后一個能返回值的語句的結果。
條件語句
>?if (expr_1) expr_2 else expr_3?
其中條件表達式expr1必須返回一個邏輯值,操作符&&和||經常被用于條件部分。
&和|與&&,||的區(qū)別在于,&和|按照逐個元素的方式進行計算,&&和||對向量的第一個元素進行運算,只有在必需的時候才對第二個參數(shù)求值。
if/else結構的向量版本是函數(shù)ifelse,其形式為ifelse (condition,a,b),產生函數(shù)結果的規(guī)則是:如果condition[i]為真,對應a[i]元素;反之對應的是b[i]元素。根據這個原則函數(shù)返回一個由a,b中相應元素組成的向量,向量長度與其最長的參數(shù)等長。
循環(huán)語句
>?for (name in expr_1) expr_2
其中name是循環(huán)變量,expr1是一個向量表達式(通常是1:20這樣的序列),而expr2經常是一個表達式語句組,expr2隨著name依次取expr1結果向量的值而被多次重復運行。
>?repeat(expr)
>?while(condition) expr
?
break語句可以用來中斷任何循環(huán),可能是非正常的中斷。而且這是中止repeat循環(huán)的唯一方式。
next語句可以中止一個特定的循環(huán),跳至下一個.
十 編寫自己的函數(shù)
10.1 函數(shù)的定義
> name <- function(arg_1, arg_2, ...) expression?
expression是一個R表達式(通常是表達式語句組),并使用參數(shù)arg_i來計算出一個數(shù)值,表達式的值就是函數(shù)的返回值。
函數(shù)調用的形式通常都是name(expr1,expr2,...)
10.2 定義新的二元操作符
可以將函數(shù)定義為新的二元操作符:
>?"%!%" <- function(X, y) { ... }
正如矩陣乘法運算符,%*%,和矩陣外積運算符%o%
10.3 指定參數(shù)和默認值
?
如果被調用函數(shù)的參數(shù)按照"name = obj"的形式給出,那么參數(shù)的次序可以是任意的。
而且,參數(shù)序列可以在開始依次序給出,而將指定名稱的參數(shù)置于后面。
因此,如果由一個函數(shù)fun1被定義為
> fun1 <- function(data, data.frame, graph, limit) {
[function body omitted]
}
那么函數(shù)可以有多種等價的使用方法,例如
> ans <- fun1(d, df, TRUE, 20)
> ans <- fun1(d, df, graph=TRUE, limit=20)
> ans <- fun1(data=d, limit=20, graph=TRUE, data.frame=df)
默認值?:在很多情況下,參數(shù)都會被賦予一個普遍適用的默認值。
> fun1 <- function(data, data.frame, graph=TRUE, limit=20) { ... }
則函數(shù)可以這樣被調用
> ans <- fun1(d, df)
此時與上面三種情況等價,也可以這樣調用
> ans <- fun1(d, df, limit=10)
此時改變了一個默認值。
NOTE:參數(shù)可以是任意表達式,甚至可以是包含其他參數(shù)的表達式;
10.4 額外參數(shù)“...”
?
當需要將一個函數(shù)的參數(shù)傳遞給另一個函數(shù)時,可以通過包含一個額外的參數(shù)"..."實現(xiàn)。
fun1 <- function(data, data.frame, graph=TRUE, limit=20, ...) {
[omitted statements]
if (graph)
par(pch="*", ...)
[more omissions]
}
10.5 全局變量和局部變量
函數(shù)內的賦值都是局部變量,退出函數(shù)就丟失了。
如果要在函數(shù)內進行永久賦值(定義全局變量),需要用到“超賦值”操作符, <<-或者函數(shù)assign()。
10.6 一些高級示例
區(qū)組設計的效率因子?(E±ciency factors)
刪除打印數(shù)組中的所有名稱
遞歸的數(shù)值積分
10.7 范疇(Scope)
?
函數(shù)主體內出現(xiàn)的標識(symbol)可以被分為3類;正式參數(shù)、局部變量和自由變量。
正式參數(shù)就是出現(xiàn)在函數(shù)參數(shù)列表中的參數(shù),他們的值由實際的函數(shù)參數(shù)與正式參數(shù)的綁定(binding)過程決定。
局部變量是在參數(shù)主體中,由表達式求值過程決定的變量。
自由變量為既不是正式參數(shù)又不是局部變量的變量。賦值之后自由變量成為局部變量。
?
在R中,自由變量的值由函數(shù)被創(chuàng)建的環(huán)境中與其同名的第一個變量值決定(我理解為最近的同名變量),這種方式被稱為詞匯式范疇(lexical scope)。
而在S中,該值由同名的全局變量決定。
例如下面的函數(shù)cube,在R中cube(2)=8,在S中報錯為sq()找不到n。
cube <- function(n) {
sq <- function() n*n
n*sq()
}
一個銀行賬戶的例子,詳見《R語言筆記》。
10.8 定制環(huán)境
詳見《R語言筆記》。
10.9 類別,通用函數(shù)和對象定位
?
一個對象的類別(class)決定了他會如何被通用函數(shù)(generic function)處理。
如果參數(shù)本身沒有任何類別屬性,或者其類別在特定問題中并不滿足通用函數(shù)的要求,通常會有一個默認的動作被執(zhí)行。
類別機制使用戶可以為特定的目的設計和編寫通用函數(shù)。
使用> methods(class="data.frame")可以查看數(shù)據幀的通用函數(shù)。
使用> methods(plot)可以查看plot函數(shù)能處理的類別。
十一 ? R的統(tǒng)計模型
待閱。
十二 圖形過程
在Windows下用window()命令可以打開圖形窗口。
12.1 高級繪圖命令
?
? ? 高級繪圖函數(shù),由函數(shù)參數(shù)提供數(shù)據生成一幅完整的圖形。其中適當?shù)淖鴺溯S,標簽和標題都自動生成了(除非你另外指定了)。高級繪圖命令每次都生成一幅新的圖形,清除當前的圖形(如果需要的話)。
1 ?plot()函數(shù)
?
這是一個通用函數(shù):生成圖形的類型取決于第一個參數(shù)的類型或類別(class)。
plot(x,y) ?plot(xy):
如果x,y是向量,plot(x,y)生成一幅y對x的散點圖。用包含兩個元素x,y的一個列表或一個兩列的矩陣作為一個參數(shù)(第二種形式那樣的)也能達成相同的效果。
plot(x):
如果x是一個時間序列,這個命令生成一個時間序列圖,如果x是一個數(shù)值型向量,則生成一個向量值對它們向量索引的土,而如果x是一個復向量,則生成一個向量中元素的虛部對實部的圖。
plot(f) ??plot(f,y):
f是一個因子對象,y是一個數(shù)值型向量。第一種形式生成一個f的條形圖;第二種形式生成y對應于f各個水平的箱線圖。
plot(df) ??plot( expr) ? ?plot(y expr):
df是一個數(shù)據幀,y是任意對象,expr是由對象名稱組成的列表,分隔符'+'(例如,a + b + c)。前兩種形式生成分布式的圖形,第一種是數(shù)據幀中的變量,第二種是一系列被命名的對象。第三種形式生成y對expr中每個對象的圖。
2 顯示多元數(shù)據
?
如果X是一個數(shù)值矩陣或數(shù)據幀,下面的命令
>?pairs(X)?
生成一個配對的散點圖矩陣,矩陣由X中的每列的列變量對其他各列列變量的散點圖組成,得到的矩陣中每個散點圖行、列長度都是固定的。
?
當問題涉及到三、四個變量時,使用coplot更好些。如果a和b是數(shù)值向量,c是數(shù)值向量或因子對象(全都是相同長度的),下面的命令
>?coplot(a ~ b | c)
對應c的某些給定值生成數(shù)個a對b的散點圖。當c是一個因子時,這個命令也就是對c的每個水平生成a對b的散點圖。當c是數(shù)值向量的時候,這個數(shù)值向量被分為一系列的條件區(qū)間(conditioning intervals),對應c的每個區(qū)間生成一個a對b的散點圖。區(qū)間的數(shù)量和位置可以通過coplot()的參數(shù)given.values來控制,函數(shù)co.intervals()也可以用來選擇區(qū)間。我們也可以使用兩個給定變量通過命令
>coplot(a ~ b | c+d)
對c和d的每個聯(lián)合條件區(qū)間生成a對b的散點圖。
?
函數(shù)coplot()和pairs()都可以使用參數(shù)panel=,這個參數(shù)可以用來定制我們得到的圖形類型。默認的是points()函數(shù),生成一個散點圖,不過通過在參數(shù)panel=中提供某些其它的低級圖形函數(shù),我們可以生成需要的各種圖形。一個很有用的函數(shù)例子是panel.smooth()。
3 顯示圖形
?
qqnorm(x) ??qqline(x) ? ?qqplot(x,y)
分布比較圖。第一種形式生成向量x對期望正態(tài)分數(shù)(一個正態(tài)記分圖),第二個在上面的圖上添加一條穿過分布分位點和數(shù)據分位點的直線。第三個命令生成x的分位點對y分位點圖,用于分別比較它們的分布。
hist(x) ? ??hist(x,nclass=n) ? ? ??hist(x,breaks=b, . . . )
生成數(shù)值變量x的直方圖。通常會自動選定一個合理的類別數(shù),不過可以通過nclass=參數(shù)來指定一個推薦值?;蛘咄ㄟ^參數(shù)breaks=來指定分界點。如果給定了probability=TRUE參數(shù),那么條形圖代表相對頻數(shù)而不是累計數(shù)。
dotchart(x, . . . )
創(chuàng)建一個x中數(shù)據的點圖(dotchart)。點圖中y軸給出x中數(shù)據的標簽,x軸給出它們的值。它允許對落入某一特定區(qū)間的所有數(shù)據項方便的進行可視化選擇。
image(x,y,z, . . . ) ? ??contour(x,y,z, . . . ) ? ?persp(x,y,z, . . . )
生成三個變量的圖。函數(shù)image是用不同的顏色繪制一些矩形方格來展示z的值,函數(shù)contour通過繪制等高線來展示z的值,函數(shù)persp繪制一個3D面。
4 參數(shù)配置
?
add=TRUE ? ? ?強制函數(shù)按照低級圖形函數(shù)的方式操作,將圖形置于當前圖形上(僅對某些函數(shù)有效)。
axes=FALSE ? ? ? 暫時禁止坐標軸的生成|以便使用axis()函數(shù)添加你自己定制的坐標軸。默認情況是axes=TRUE,即包含坐標軸。
log="x" ??log="y" ??log="xy" ? ? ?令x,y或者兩者全都對數(shù)化。這個參數(shù)對許多函數(shù)都有效,不過不是全部。
type= ? ? ? ? ?參數(shù)type=控制所生成圖形的類型:
? ? ? ??type="p" 繪制單獨的點(默認值)
? ? ? ??type="l" 繪制線
? ? ? ??type="b" 繪制由線連接的點(both)
? ? ? ??type="o" 將點繪在線上
? ? ? ??type="h" 繪制從點到零軸的垂線(high-density)
? ? ? ??type="s"?階梯式圖。第一種形式中,點由垂線的頂部定義;第二種形式里用底部定義。
? ? ? ??type="n" 不繪制。不過坐標軸是繪出的(默認情況)而且要根據數(shù)據繪出坐標系統(tǒng)。用來給后續(xù)的低級圖形函數(shù)創(chuàng)建圖形作基礎。
xlab=string ? ?ylab=string ? ? ? ? ?x軸或y軸的標簽。使用這些參數(shù)來改變默認的標簽,通常的默認值是調用高級繪圖函數(shù)時所使用對象的名稱。
main=string ? ? ? ? ?圖表標題,位于圖形的頂部,大字體顯示。?
sub=string ? ? ? ??子標題,位于x軸下面,用較小的字體顯示。
12.2 ? 低級繪圖命令
?
有些時候高級繪圖函數(shù)并不能很精確的生成我們想要的圖形。這種情況下,我們可以通過低級繪圖命令在當前圖形上添加信息(例如,點、線或文本)。
points(x,y) ? ?lines(x,y)
在當前圖形上添加點或線。函數(shù)plot()的參數(shù)type=也可以用于這些函數(shù)(默認的是"p"代表points()和"l"代表lines())。
text(x,y,labels, . . . )
給定點坐標x,y,在該點添加文本。通常labels是一個整數(shù)或字符向量,其中l(wèi)abels[i]出現(xiàn)在點(x[i],y[i])。默認值是1:length(x)。
Note: 這個函數(shù)通常用于這樣的序列中
?> plot(x, y, type="n"); text(x, y, names)
圖形參數(shù)type="n"阻止了點的生成,但是建立了坐標軸,由函數(shù)text()提供字符向量names所指定的特定字符。
?
abline(a, b) ??abline(h=y) ??abline(v=x) ? ?abline(lm.obj)
在當前圖上添加一條斜率為b,截距為a的直線。h=y在圖形指定的高度上繪制一條貫穿圖形的水平線,同樣的,v=x在x軸的指定位置繪制一條貫穿的垂線。而lm.obj是一個包含coefficients組件的列表,該組件的長度為2,分別當作截距和斜率。
polygon(x, y, . . . )
繪制一個多邊形,其頂點由(x,y)指定。同時還(可選的)可以加上陰影線,如果圖形設備允許的話還可以將多邊形填充。
legend(x, y, legend, . . . )
這當前圖形的指定位置添加圖例。繪制的字符,線條類型,顏色等等由字符向量legend指定。除此之外至少還要給出一個參數(shù)v,與繪圖單元的相應值,分別有:
legend( , fill=v)填充方框的顏色
legend( , col=v)繪制點線的顏色
legend( , lty=v)線條類型
legend( , lwd=v)線條寬度
legend( , pch=v)繪制字符(字符向量)
?
title(main,sub)
在當前圖形的頂部用大字題添加一個標題main,在底部用較小的字體添加子標題sub。
axis(side, . . . )
在當前圖形的指定邊上添加坐標,在哪個邊上由第一個參數(shù)指定(1到4,從底部按照順時針順序)。其他參數(shù)控制坐標的位置|在圖形內或圖形外,以及標記的位置和標簽。適合在調用參數(shù)為axes=FALSE的函數(shù)plot()后添加定制的坐標軸。
低級繪圖函數(shù)通常都需要一些位置信息(例如,x,y坐標)來決定在哪里添加新的元素。坐標以用戶坐標(user coordinates)的形式給出,這個坐標系是根據所提供的數(shù)據由之前的高級繪圖語句定義的。需要x,y參數(shù)的地方還可以選用
鏈接地址:http://m.szxfmmzy.com/p-1571115.html