Chapter04 基本數(shù)據(jù)管理_第1頁
Chapter04 基本數(shù)據(jù)管理_第2頁
Chapter04 基本數(shù)據(jù)管理_第3頁
Chapter04 基本數(shù)據(jù)管理_第4頁
Chapter04 基本數(shù)據(jù)管理_第5頁
已閱讀5頁,還剩114頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

第4章

基本數(shù)據(jù)管理本章內(nèi)容操縱日期和缺失值熟悉數(shù)據(jù)類型的轉(zhuǎn)換變量的創(chuàng)建和重編碼數(shù)據(jù)集的排序,合并與取子集選入和丟棄變量4.1一個(gè)示例4.2創(chuàng)建新變量在典型的研究項(xiàng)目中,你可能需要?jiǎng)?chuàng)建新變量或者對(duì)現(xiàn)有的變量進(jìn)行變換。這可以通過以下形式的語句來完成:變量名←表達(dá)式以上語句中的“表達(dá)式”部分可以包含多種運(yùn)算符和函數(shù)。表4-2列出了R中的算術(shù)運(yùn)算符。算術(shù)運(yùn)算符可用于構(gòu)造公式(formula)假設(shè)你有一個(gè)名為mydata的數(shù)據(jù)框,其中的變量為x1和x2,現(xiàn)在你想創(chuàng)建一個(gè)新變量sumx存儲(chǔ)以上兩個(gè)變量的加和,并創(chuàng)建一個(gè)名為meanx的新變量存儲(chǔ)這兩個(gè)變量的均值。三種不同的方式來實(shí)現(xiàn)這個(gè)目標(biāo)第三種方式,即transform()函數(shù)的一個(gè)示例。這種方式簡化了按需創(chuàng)建新變量并將其保存到數(shù)據(jù)框中的過程。4.3變量的重編碼重編碼涉及根據(jù)同一個(gè)變量和/或其他變量的現(xiàn)有值創(chuàng)建新值的過程。你可能想:將一個(gè)連續(xù)型變量修改為一組類別值;將誤編碼的值替換為正確值;基于一組分?jǐn)?shù)線創(chuàng)建一個(gè)表示及格/不及格的變量。函數(shù)within()與函數(shù)with()類似(見2.2.4節(jié)),不同的是它允許你修改數(shù)據(jù)框。首先,我們創(chuàng)建了agecat變量,并將每一行都設(shè)為缺失值。括號(hào)中剩下的語句接下來依次執(zhí)行。請(qǐng)記住agecat現(xiàn)在只是一個(gè)字符型變量,你可能更希望像2.2.5節(jié)講解的那樣把它轉(zhuǎn)換成一個(gè)有序型因子若干程序包都提供了實(shí)用的變量重編碼函數(shù),特別地,car包中的recode()函數(shù)可以十分簡便地重編碼數(shù)值型、字符型向量或因子。而doBy包提供了另外一個(gè)很受歡迎的函數(shù)recodevar()。最后,R中也自帶了cut(),可將一個(gè)數(shù)值型變量按值域切割為多個(gè)區(qū)間,并返回一個(gè)因子。4.4變量的重命名如果對(duì)現(xiàn)有的變量名稱不滿意,你可以交互地或者以編程的方式修改它們。假設(shè)你希望將變量名manager修改為managerID,并將date修改為testDate,那么可以使用語句,來調(diào)用一個(gè)交互式的編輯器,單擊變量名,然后在彈出的對(duì)話框中將其重命名rename()函數(shù)若以編程方式,reshape包中有一個(gè)rename()函數(shù),可用于修改變量名。rename()函數(shù)的使用格式為:names()函數(shù)最后,可以通過names()函數(shù)來重命名變量4.5缺失值在R中,缺失值以符號(hào)NA(NotAvailable,不可用)表示。不可能出現(xiàn)的值(例如,被0除的結(jié)果)通過符號(hào)NaN(NotaNumber,非數(shù)值)來表示。與SAS等程序不同,R中字符型和數(shù)值型數(shù)據(jù)使用的缺失值符號(hào)是相同的。函數(shù)is.na()允許你檢測(cè)缺失值是否存在4.5.1重編碼某些值為缺失值請(qǐng)確保所有的缺失數(shù)據(jù)已在分析之前被妥善地編碼為缺失值,否則分析結(jié)果將失去意義。4.5.2在分析中排除缺失值確定了缺失值的位置以后,你需要在進(jìn)一步分析數(shù)據(jù)之前以某種方式刪除這些缺失值。原因是,含有缺失值的算術(shù)表達(dá)式和函數(shù)的計(jì)算結(jié)果也是缺失值多數(shù)的數(shù)值函數(shù)都擁有一個(gè)na.rm=TRUE選項(xiàng),可以在計(jì)算之前移除缺失值并使用剩余值進(jìn)行計(jì)算在使用函數(shù)處理不完整的數(shù)據(jù)時(shí),請(qǐng)務(wù)必查閱它們的幫助文檔(例如,help(sum)),檢查這些函數(shù)是如何處理缺失數(shù)據(jù)的。函數(shù)sum()只是我們將在第5章中討論的眾多函數(shù)之一,使用這些函數(shù)可以靈活而輕松地轉(zhuǎn)換數(shù)據(jù)。你可以通過函數(shù)na.omit()移除所有含有缺失值的觀測(cè)。na.omit()可以刪除所有含有缺失數(shù)據(jù)的行。4.6日期值日期值通常以字符串的形式輸入到R中,然后轉(zhuǎn)化為以數(shù)值形式存儲(chǔ)的日期變量。函數(shù)as.Date()用于執(zhí)行這種轉(zhuǎn)化。其語法為s.Date(x,"input_format"),其中x是字符型數(shù)據(jù),input_format則給出了用于讀入日期的適當(dāng)格式使用指定格式讀取字符型變量,并將其作為一個(gè)日期變量替換到數(shù)據(jù)框中。這種轉(zhuǎn)換一旦完成,你就可以使用后續(xù)各章中講到的諸多分析方法對(duì)這些日期進(jìn)行分析和繪圖。有兩個(gè)函數(shù)對(duì)于處理時(shí)間戳數(shù)據(jù)特別實(shí)用。Sys.Date()可以返回當(dāng)天的日期,而date()則返回當(dāng)前的日期和時(shí)間可以使用函數(shù)format(x,format="output_format")來輸出指定格式的日期值,并且可以提取日期值中的某些部分format()函數(shù)可接受一個(gè)參數(shù)(本例中是一個(gè)日期)并按某種格式輸出結(jié)果R的內(nèi)部在存儲(chǔ)日期時(shí),是使用自1970年1月1日以來的天數(shù)表示的,更早的日期則表示為負(fù)數(shù)。這意味著可以在日期值上執(zhí)行算術(shù)運(yùn)算。也可以使用函數(shù)difftime()來計(jì)算時(shí)間間隔,并以星期、天、時(shí)、分、秒來表示4.6.1將日期轉(zhuǎn)換為字符型變量你同樣可以將日期變量轉(zhuǎn)換為字符型變量——雖然不太常用。函數(shù)as.character()可將日期值轉(zhuǎn)換為字符型:進(jìn)行轉(zhuǎn)換后,即可使用一系列字符處理函數(shù)處理數(shù)據(jù)(如取子集、替換、連接等)。我們將在第5章中詳述字符處理函數(shù)。4.6.2更進(jìn)一步要了解字符型數(shù)據(jù)轉(zhuǎn)換為日期的更多細(xì)節(jié),請(qǐng)查看help(as.Date)和help(strftime)。要了解更多關(guān)于日期和時(shí)間格式的知識(shí),請(qǐng)參考help(ISOdatetime)。lubridate包中包含了許多簡化日期處理的函數(shù),可以用于識(shí)別和解析日期-時(shí)間數(shù)據(jù),抽取日期—時(shí)間成分(例如年份、月份、日期等),以及對(duì)日期—時(shí)間值進(jìn)行算術(shù)運(yùn)算。如果你需要對(duì)日期進(jìn)行復(fù)雜的計(jì)算,那么fCalendar包可能會(huì)有幫助。它提供了大量的日期處理函數(shù),可以同時(shí)處理多個(gè)時(shí)區(qū),并且提供了復(fù)雜的歷法操作功能,支持工作日、周末以及假期。4.7類型轉(zhuǎn)換R中提供了一系列用來判斷某個(gè)對(duì)象的數(shù)據(jù)類型和將其轉(zhuǎn)換為另一種數(shù)據(jù)類型的函數(shù)R與其他統(tǒng)計(jì)編程語言有著類似的數(shù)據(jù)類型轉(zhuǎn)換方式。舉例來說,向一個(gè)數(shù)值型向量中添加一個(gè)字符串會(huì)將此向量中的所有元素轉(zhuǎn)換為字符型。你可以使用表4-5中列出的函數(shù)來判斷數(shù)據(jù)的類型或者將其轉(zhuǎn)換為指定類型。當(dāng)和第5章中討論的控制流(如if-then)結(jié)合使用時(shí),is.datatype()這樣的函數(shù)將成為一類強(qiáng)大的工具,即允許根據(jù)數(shù)據(jù)的具體類型以不同的方式處理數(shù)據(jù)。另外,某些R函數(shù)需要接受某個(gè)特定類型(字符型或數(shù)值型,矩陣或數(shù)據(jù)框)的數(shù)據(jù),as.datatype()這類函數(shù)可以讓你在分析之前先行將數(shù)據(jù)轉(zhuǎn)換為要求的格式。4.8數(shù)據(jù)排序在R中,可以使用order()函數(shù)對(duì)一個(gè)數(shù)據(jù)框進(jìn)行排序。默認(rèn)的排序順序是升序。在排序變量的前邊加一個(gè)減號(hào)即可得到降序的排序結(jié)果。4.9數(shù)據(jù)集的合并4.9.1添加列要橫向合并兩個(gè)數(shù)據(jù)框(數(shù)據(jù)集),請(qǐng)使用merge()函數(shù)。在多數(shù)情況下,兩個(gè)數(shù)據(jù)框是通過一個(gè)或多個(gè)共有變量進(jìn)行聯(lián)結(jié)的(即一種內(nèi)聯(lián)結(jié),innerjoin)4.9.2添加行要縱向合并兩個(gè)數(shù)據(jù)框(數(shù)據(jù)集),請(qǐng)使用rbind()函數(shù):4.10數(shù)據(jù)集取子集4.10.1選入(保留)變量數(shù)據(jù)框中的元素是通過dataframe[rowindices,columnindices]這樣的記號(hào)來訪問的。你可以沿用這種方法來選擇變量4.10.2剔除(丟棄)變量4.10.3選入觀測(cè)4.10.4subset()函數(shù)4.10.5隨機(jī)抽樣4.11使用SQL語句操作數(shù)據(jù)框

sqldf()函數(shù)在數(shù)據(jù)框上使用SQL中的SELECT語句S語言是基于對(duì)象(Object)的語言基本的數(shù)據(jù)類型有:向量、矩陣、列表等復(fù)雜的數(shù)據(jù)對(duì)象有:數(shù)據(jù)框?qū)ο螅瑫r(shí)間序列對(duì)象,模型對(duì)象,圖形對(duì)象,等等。S語言表達(dá)式可以使用常量和變量。變量名:由字母、數(shù)字、句點(diǎn)組成,第一個(gè)字符必須是字母,長度沒有限制,但區(qū)分大小寫。特別要注意句點(diǎn)可以作為名字的合法部分。常量常量:數(shù)值型、邏輯型和字符型三種;數(shù)值型數(shù)據(jù):整型、單精度、雙精度等例如:123,123.45,1.2345e30是數(shù)值型常量;“Weight”,“李明”是字符型;邏輯真值寫為T或TRUE(注意區(qū)分大小寫,寫t或true都沒意義),邏輯假值寫為F或FALSE。復(fù)數(shù)常量就用3.5-2.1i這樣的寫法表示。S中的數(shù)據(jù)可以取缺失值,用符號(hào)NA代表缺失值。函數(shù)is.na(x)返回x是否缺失值(返回值T或F)。向量(Vector)與賦值

向量:定義向量的最常用辦法是使用函數(shù)c(),它把若干個(gè)數(shù)值或字符串組合為一個(gè)向量,比如:>x=c(1:3,10:13)>x[1]12310111213S中用符號(hào)“<-”、“=”來為變量賦值。另一種賦值的辦法是用assign函數(shù):>x1=c(1,2)>assign(“x1”,c(1,2))函數(shù)length(x):計(jì)算向量x的長度。向量運(yùn)算

加(+)減(-)乘(*)除(/)、乘方(^)運(yùn)算,其含意是對(duì)向量的每一個(gè)元素進(jìn)行運(yùn)算。例如:

>x<-c(1,4,6.25)>y=x*2+1>y[1]3.09.013.5

%/%表示整數(shù)除法(比如5%/%3為1),

%%表示求余數(shù)(如5%%3為2)??梢杂孟蛄孔鳛楹瘮?shù)自變量,

sqrt、log、exp、sin、cos、tan等函數(shù)都可以用向量作自變量,結(jié)果是對(duì)向量的每一個(gè)元素取相應(yīng)的函數(shù)值

min、max:取向量自變量的最小值和最大值

sum:計(jì)算向量自變量的元素和

mean:計(jì)算均值,

var:計(jì)算樣本方差(分母為n-1),

sd計(jì)算標(biāo)準(zhǔn)差

x是矩陣,則var(x)返回值為樣本協(xié)方差陣。

(行向量為觀測(cè)值)

sort(x)

返回x的元素從小到大排序的結(jié)果向量

order(x)

返回使得x從小到大排列的元素下標(biāo)向量(x[order(x)]等效于sort(x))。

>x=c(2,4,8,6,10)>order(x)[1]12435>x[order(x)][1]246810任何數(shù)與缺失值的運(yùn)算結(jié)果仍為缺失值。例如,>2*c(1,NA,2)[1]2NA4>sum(c(1,NA,2))[1]NA產(chǎn)生有規(guī)律的數(shù)列等差數(shù)列:例如:1:n產(chǎn)生從1到n的整數(shù)列,

-2:3產(chǎn)生從-2到3的整數(shù)列,

5:2產(chǎn)生反向的數(shù)列:注意1:n-1不是代表1到n-1而是向量1:n減去1,>1:n-1[1]01234>1:(n-1)[1]1234seq函數(shù):更一般的等差數(shù)列函數(shù)。

>seq(n):等價(jià)于1:n(n>0)

>seq(-2,3):是從-2到3,默認(rèn)公差為1

>seq(0,2,0.7)[1]0.00.71.4>seq(from=0,to=2,by=0.7)有參數(shù)名的參數(shù)的次序任意,如:

>seq(0,by=0.7,to=2)[1]0.00.71.4可以用length參數(shù)指定數(shù)列長度,如seq(from=10,length=5)產(chǎn)生10到14。

seq(along=向量名):產(chǎn)生向量的下標(biāo)序列

>x[1]1.004.006.25>seq(along=x)[1]123

rep(x,n):重復(fù)x對(duì)象n次

>rep(x,3)[1]1.004.006.251.004.006.251.004.006.25

numeric(n):產(chǎn)生一個(gè)長度為n的零向量

邏輯向量

向量可以取邏輯值,如:

>l=c(T,T,F)>l輸出[1]TRUETRUEFALSE

當(dāng)然,邏輯向量往往是一個(gè)比較的結(jié)果,如:

>x輸出

[1]1.004.006.25>l=x>3>l輸出

[1]FALSETRUETRUE一個(gè)向量與常量比較大小,結(jié)果還是一個(gè)向量,元素為每一對(duì)比較的結(jié)果邏輯值。兩個(gè)向量也可以比較,

>log(10*x)[1]2.3025853.6888794.135167>log(10*x)>x輸出[1]TRUEFALSEFALSE

比較運(yùn)算符:<,<=,>,>=,==,!=

邏輯運(yùn)算:且(&)、或(|)、非!

例如:>x=c(1,4,6.25,1.6)>(x>1.5)&(x<3)[1]FALSEFALSEFALSETRUE

判斷一個(gè)邏輯向量是否都為真值的函數(shù)是all:

>all(log(10*x)>x)[1]FALSE

判斷是否其中有真值的函數(shù)是any:

>any(log(10*x)>x)[1]TRUEis.na(x):用來判斷x的每一個(gè)元素是否缺失

>is.na(c(1,NA,3))[1]FALSETRUEFALSE邏輯值可以強(qiáng)制轉(zhuǎn)換為整數(shù)值:

TRUE變成1,F(xiàn)ALSE變成0。例如,age>65為老年人,否則為年輕人,可以用c(“young”,“old”)[(age>65)+1]表示。當(dāng)年齡大于65時(shí)age>65等于TRUE,加1則把TRUE轉(zhuǎn)換為數(shù)值型的1,結(jié)果得2,于是返回第二個(gè)下標(biāo)處的“old”。否則等于0+1下標(biāo)處的“young”。age=c(89,20,10,66);c('young','old')[(age>65)+1];[1]"old""young""young""old"字符型向量

向量元素可以取字符串值。例如:

>c1=c("x","sin(x)")>c1

輸出

[1]"x""sin(x)">ns=c("Weight","Height","年齡")>ns輸出[1]"Weight""Height""年齡"paste函數(shù)用來把它的自變量連成一個(gè)字符串,中間用空格分開,例如:>paste("My","Job")[1]"MyJob">paste('Hi','早')

輸出[1]"Hi早"連接的自變量可以是向量:這時(shí)各對(duì)應(yīng)元素連接起來,長度不相同時(shí)較短的向量被重復(fù)使用。例如:

>paste(c("X","Y"),"=",1:4)[1]"X=1""Y=2""X=3""Y=4"分隔用的字符可以用sep參數(shù)指定,例如:

>paste('result.',1:5,sep="")[1]"result.1""result.2""result.3""result.4""result.5"如果給paste()函數(shù)指定了collapse參數(shù),則把字符串向量的各個(gè)元素連接成一個(gè)字符串,中間用collapse指定的值分隔。比如

>paste(c('a','b'),collapse='.')得到'a.b'。復(fù)數(shù)向量

S支持復(fù)數(shù)運(yùn)算。復(fù)數(shù)常量只要用3.5+2.1i這樣的格式即可。復(fù)向量的每一個(gè)元素都是復(fù)數(shù)。

complex()函數(shù)生成復(fù)向量(見幫助)

Re()計(jì)算實(shí)部

Im()計(jì)算虛部,

Mod()

計(jì)算復(fù)數(shù)模

Arg()計(jì)算復(fù)數(shù)幅角。>complex(2)[1]0+0i0+0i>complex(2,4,6)[1]4+6i4+6i>complex(1,4,6)[1]4+6iy=1:2+1i*(8:9)>y[1]1+8i2+9i

>Re(y)[1]12>Im(y)[1]89>Mod(y)[1]8.0622589.219544>Arg(y)[1]1.4464411.352127向量下標(biāo)運(yùn)算

某一個(gè)元素只要用x[i]的格式訪問,其中x是一個(gè)向量名,或一個(gè)取向量值的表達(dá)式,如:

>x[1]1.004.006.25>x[2][1]4>(c(1,3,5)+5)[2][1]8

可以單獨(dú)改變一個(gè)元素的值,例如:>x[2]<-125>x[1]1.00125.006.25S提供了四種方法:格式為x[v]一、取正整數(shù)值的下標(biāo)向量

v為一個(gè)向量,取值在1到length(x)之間,取值允許重復(fù),例如,

>x[c(1,3)][1]1.006.25>x[1:2][1]1125>x[c(1,3,2,1)][1]1.006.25125.001.00>c("a","b","c")[rep(c(2,1,3),3)][1]"b""a""c""b""a""c""b""a""c"二、取負(fù)整數(shù)值的下標(biāo)向量

v為一個(gè)向量,取值在-length(x)到-1之間,表示扣除相應(yīng)位置的元素。例如:

>x[-(1:2)][1]6.25三、取邏輯值的下標(biāo)向量

v為和x等長的邏輯向量,x[v]表示取出所有v為真值的元素,如:

>x輸出:[1]1.00125.006.25>x<10輸出:

[1]TRUEFALSETRUE>x[x<10]輸出:

[1]1.006.25>x[x<0]輸出:

numeric(0)可見x[x<10]取出所有小于10的元素組成的子集。這種邏輯值下標(biāo)是一種強(qiáng)有力的檢索工具,例如x[sin(x)>0]可以取出x中所有正弦函數(shù)值為正的元素組成的向量。如果下標(biāo)都是假值則結(jié)果是一個(gè)零長度的向量,顯示為numeric(0)。四、取字符型值的下標(biāo)向量在定義向量時(shí)可以給元素加上名字,例如:

>ages<-c(Li=33,Zhang=29,Liu=18)>ages輸出:LiZhangLiu332918

>ages[1]輸出:Li33>ages[1]=2>ages[1]輸出:Li2

向量還可用元素名字來訪問元素或元素子集,例如:>ages[c("Li","Liu")]輸出:LiLiu3318

向量元素名可以后加:例>ages1=c(33,29,18)>names(ages1)=c("Li","Zhang","Liu")

>ages1輸出

LiZhangLiu332918

S中還可以改變一部分元素的值,例如:>x[1]1.00125.006.25>x[c(1,3)]=c(144,169)>x[1]144125169

注意:賦值的長度必須相同,例外是可以把部分元素賦為一個(gè)統(tǒng)一值:>x[c(1,3)]=0;>x[1]01250要把向量所有元素賦為一個(gè)相同的值:>x[]=0

注意:這與“x=0”是不同的,前者賦值后向量長度不變,后者使向量變?yōu)闃?biāo)量0。

定義向量的分段函數(shù):改變部分元素值的技術(shù)與邏輯值下標(biāo)方法結(jié)合例如:y=f(x):當(dāng)x<0時(shí)取1-x,否則取1+x,可以用:>y=numeric(length(x))>y[x<0]=1-x[x<0]>y[x>=0]=1+x[x>=0]例:y=f(x),當(dāng)x<3.0時(shí)取x,

3.0=<x<3.5時(shí)取x+10,否則取x+20;x=c(0.5,-1,1,2,3,4,1,2,3,4);求y.x=c(0.5,-1,1,2,3,4,1,2,3,4);y=numeric(length(x));y[x<3]=x[x<3];y[(x>=3)&(x<3.5)]=x[(x>=3)&(x<3.5)]+10;y[x>3.5]=x[x>3.5]+20;x;y;多維數(shù)組和矩陣

數(shù)組(array)和矩陣(matrix)

數(shù)組(array)帶多個(gè)下標(biāo)的類型相同的元素的集合,常用的是數(shù)值型的數(shù)組如矩陣,也可以有其它類型(如字符型、邏輯型、復(fù)型數(shù)組)。數(shù)組有一個(gè)特征屬性叫做維數(shù)向量(dim屬性),如:維數(shù)向量有兩個(gè)元素時(shí)數(shù)組為二維數(shù)組(矩陣)注:一組值只有定義了維數(shù)向量(dim屬性)后才能被看作是數(shù)組。比如:

>a=1:24>a>dim(a)=c(2,3,4)>a

數(shù)組(array)和矩陣(matrix)數(shù)組元素的排列次序缺省情況下:按列存放,例如,假設(shè)數(shù)組a的元素為1:24,維數(shù)向量為c(2,3,4),則各元素次序?yàn)閍[1,1,1],a[2,1,1],a[1,2,1],a[2,2,1],a[1,3,1],...,a[2,3,4]。用函數(shù)array()或matrix()可以更直觀地定義數(shù)組。array(x,dim=length(x),dimnames=NULL),其中x是第一自變量,應(yīng)該是一個(gè)向量,表示數(shù)組的元素值組成的向量。

dim參數(shù)缺省略時(shí)作為一維數(shù)組(但不同于向量)

dimnames屬性可以省略,不省略時(shí)是一個(gè)長度與維數(shù)相同的列表(list,見后面),列表的每個(gè)成員為一維的名字。函數(shù)matrix():二維數(shù)組,即矩陣。

matrix(data=NA,nrow=1,ncol=1,byrow=FALSE,dimnames=NULL)

其中第一自變量data為數(shù)組的數(shù)據(jù)向量(缺省值為缺失值NA),nrow為行數(shù),ncol為列數(shù),byrow表示數(shù)據(jù)填入矩陣時(shí)按行次序還是列次序,缺省情況下按列次序。

dimnames缺省是空值,否則是一個(gè)長度為2的列表,列表第一個(gè)成員是長度與行數(shù)相等的字符型向量,表示每行的標(biāo)簽,列表第二個(gè)成員是長度與列數(shù)相同的字符型向量,表示每列的標(biāo)簽。例如,定義一個(gè)3行4列,由1:12按行次序排列的矩陣,可以用:>b<-matrix(1:12,ncol=4,byrow=T)>b<-matrix(1:12,ncol=4,byrow=T)>b[,1][,2][,3][,4][1,]1234[2,]5678[3,]9101112注意:在有數(shù)據(jù)的情況下只需指定行數(shù)或列數(shù)之一。指定的數(shù)據(jù)個(gè)數(shù)允許少于所需的數(shù)據(jù)個(gè)數(shù),這時(shí)循環(huán)使用提供的數(shù)據(jù)。例如:>b<-matrix(0,nrow=3,ncol=4)

生成3行4列的元素都為0的矩陣。數(shù)組下標(biāo)

訪問數(shù)組的某個(gè)元素,寫出數(shù)組名和方括號(hào)內(nèi)用逗號(hào)分開的下標(biāo)即可,如a[2,1,2]。在每一個(gè)下標(biāo)位置寫一個(gè)下標(biāo)向量,表示對(duì)這一維取出所有指定下標(biāo)的元素,如a[1,2:3,2:3]取出所有第一下標(biāo)為1,第二下標(biāo)為2或3,第三下標(biāo)為2或3的元素。略寫某一維的下標(biāo),則表示該維全選。a[,,]或a[]都表示整個(gè)數(shù)組。a[]=0

把元素都賦成0。還有一種特殊下標(biāo)是對(duì)于數(shù)組只用一個(gè)下標(biāo)向量(是向量,不是數(shù)組),比如a[3:4],這時(shí)忽略數(shù)組的維數(shù)信息,把下標(biāo)表達(dá)式看作是對(duì)數(shù)組的數(shù)據(jù)向量取子集。不規(guī)則數(shù)組下標(biāo)

可以把數(shù)組中的任意位置的元素作為一組訪問,其方法是用一個(gè)矩陣作為數(shù)組的下標(biāo),例如,將c(2,3,4)的數(shù)組a的第[1,1,1],[2,2,3],[1,3,4],[2,1,4]號(hào)共四個(gè)元素作為一個(gè)整體訪問,先定義一個(gè)包含這些下標(biāo)作為行的二維數(shù)組:>b=matrix(c(1,1,1,2,2,3,1,3,4,2,1,4),ncol=3,byrow=T)>b

>a[b]>x1<-c(100,200)>x2<-1:6>x1+x2>x3<-matrix(1:6,nrow=3)>x3>x1+x3數(shù)組四則運(yùn)算

數(shù)組可以進(jìn)行四則運(yùn)算(+,-,*,/,^),參加運(yùn)算的數(shù)組一般應(yīng)該是相同形狀的(dim屬性完全相同)。例如,假設(shè)A,B,C是三個(gè)形狀相同的數(shù)組,則>D<-C+2*A/B四則運(yùn)算遵循通常的優(yōu)先級(jí)規(guī)則。形狀不一致的向量和數(shù)組也可以進(jìn)行四則運(yùn)算,一般的規(guī)則是數(shù)組的數(shù)據(jù)向量對(duì)應(yīng)元素進(jìn)行運(yùn)算,把短的循環(huán)使用來與長的匹配,并盡可能保留共同的數(shù)組屬性。例如:不規(guī)則運(yùn)算除非你清楚地知道規(guī)則,否則應(yīng)避免使用這樣的辦法(標(biāo)量與數(shù)組或向量的四則運(yùn)算除外)。矩陣運(yùn)算

矩陣是二維數(shù)組,應(yīng)用廣泛函數(shù)t(A)返回矩陣A的轉(zhuǎn)置。nrow(A)為矩陣A的行數(shù),ncol(A)為矩陣A的列數(shù)。矩陣之間進(jìn)行普通的加減乘除四則運(yùn)算:即數(shù)組的對(duì)應(yīng)元素之間進(jìn)行運(yùn)算,所以注意A*B不是矩陣乘法而是矩陣對(duì)應(yīng)元素相乘。要進(jìn)行矩陣乘法,使用運(yùn)算符%*%:如:A%*%B表示矩陣A乘以矩陣B>A<-matrix(1:12,nrow=4,ncol=3,byrow=T)>B<-matrix(c(1,0),nrow=3,ncol=2,byrow=T)>A%*%B另外,向量用在矩陣乘法中可以作為行向量看待也可以作為列向量看待,這要看哪一種觀點(diǎn)能夠進(jìn)行矩陣乘法運(yùn)算。例如,設(shè)x是一個(gè)長度為n的向量,A是一個(gè)n*n矩陣,則“x%*%A%*%x”表示二次型。但是,有時(shí)向量在矩陣乘法中的地位并不清楚,比如“x%*%x”就既可能表示內(nèi)積,也可能表示n*n陣,最好還是用crossprod(x)來計(jì)算。要表示n*n陣,可以用“cbind(x)%*%x”或“x%*%rbind(x)”。

函數(shù)crossprod(X,Y):表示一般的交叉乘積(內(nèi)積),即X的每一列與Y的每一列的內(nèi)積組成的矩陣。如果X和Y都是向量則是一般的內(nèi)積。只寫一個(gè)參數(shù)X的crossprod(X)計(jì)算X自身的內(nèi)積。解線性方程組:solve(A,b)solve(A)求方陣A的逆矩陣,

svd()計(jì)算奇異值分解,

qr()計(jì)算QR分解,

eigen()計(jì)算特征向量和特征值。例如:>?qr函數(shù)diag():依賴于其自變量。diag(vector)返回以自變量為主對(duì)角元素的對(duì)角矩陣。diag(matrix)返回由矩陣的主對(duì)角元素組成的向量。diag(k)(k為標(biāo)量)返回k階單位陣。>x=1:3>x[1]123>crossprod(x)[,1][1,]14>cbind(x)%*%x[,1][,2][,3][1,]123[2,]246[3,]369>x%*%rbind(x)[,1][,2][,3][1,]123[2,]246[3,]369>y=diag(x)>y[,1][,2][,3][1,]100[2,]020[3,]003>diag(y)[1]123>diag(3)[,1][,2][,3][1,]100[2,]010[3,]001矩陣合并與拉直

函數(shù)cbind()把其自變量橫向拼成一個(gè)大矩陣,rbind()把其自變量縱向拼成一個(gè)大矩陣。cbind()的自變量是矩陣或者看作列向量的向量,自變量的高度應(yīng)該相等(對(duì)于向量,高度即長度,對(duì)于矩陣,高度即行數(shù))。rbind的自變量是矩陣或看作行向量的向量,自變量的寬度應(yīng)該相等(對(duì)于向量,寬度即長度,對(duì)于矩陣,寬度即列數(shù))。如果參與合并的自變量比其它自變量短則循環(huán)補(bǔ)足后合并。例如:>x1=rbind(c(1,2),c(3,4))>x1[,1][,2][1,]12[2,]34>x2<-10+x1>x3<-cbind(x1,x2)>x3[,1][,2][,3][,4][1,]121112[2,]341314>x4=rbind(x1,x2)>x4[,1][,2][1,]12[2,]34[3,]1112[4,]1314>cbind(1,x1)[,1][,2][,3][1,]112[2,]134

數(shù)組轉(zhuǎn)化為向量

as.vector(a)

(注意函數(shù)只能通過函數(shù)值返回結(jié)果而不允許修改它的自變量,比如t(X)返回X的轉(zhuǎn)置矩陣而X本身并未改變)另一種由數(shù)組得到其數(shù)據(jù)向量的簡單辦法是使用函數(shù)c()

,例如c(a)的結(jié)果是a的數(shù)據(jù)向量。

c()允許多個(gè)自變量,可以把多個(gè)自變量都看成數(shù)據(jù)向量連接起來。例如,設(shè)A和B是兩個(gè)矩陣,則c(A,B)表示把A按列次序拉直為向量并與把B按列次序拉直為向量的結(jié)果連接起來,一定注意拉直時(shí)是按列次序拉直的。>a=rbind(c(1,2),c(3,4))>a[,1][,2][1,]12[2,]34>as.vector(a)[1]1324>b=t(a)>b[,1][,2][1,]13[2,]24>c(a,b)[1]13241234數(shù)組的維名字

數(shù)組可以有一個(gè)屬性dimnames保存各維的各個(gè)下標(biāo)的名字,缺省時(shí)為NULL(即無此屬性)。以矩陣為例,它有兩個(gè)維:行維和列維。比如,設(shè)x為2行3列矩陣,它的行維可以定義一個(gè)長度為2的字符向量作為每行的名字,它的列維可以定義一個(gè)長度為3的向量作為每列的名字,屬性dimnames是一個(gè)列表,列表的每個(gè)成員是一個(gè)維名字的字符向量或NULL。例如:

>x<-matrix(1:6,ncol=2,dimnames=list(c("one","two","three"),c("First","Second")),byrow=T)>xFirstSecondone12two34three56我們也可以先定義矩陣x然后再為dimnames(x)賦值。對(duì)于矩陣,我們還可以使用屬性rownames和colnames來訪問行名和列名。在定義了數(shù)組的維名后我們對(duì)這一維的下標(biāo)就可以用它的名字來訪問,>x<-matrix(1:6,ncol=2,byrow=T)>rownames(x)<-c("第一行","第二行","第三行")>colnames(x)<-c("第一列","第二列")>x

第一列第二列第一行12第二行34第三行56>x["第一行","第二列"][1]2>x["第一行",]

第一列第二列

12>x[,"第二列"]

第一行第二行第三行

246數(shù)組的外積

兩個(gè)數(shù)組a和b的外積是由a的每一個(gè)元素與b的每一個(gè)元素搭配在一起相乘得到一個(gè)新元素,這樣得到一個(gè)維數(shù)向量等于a的維數(shù)向量與b的維數(shù)向量連起來的數(shù)組,即若d為a和b的外積,則dim(d)=c(dim(a),dim(b))。a和b的外積記作a%o%b。如>d<-a%o%b函數(shù)調(diào)用的形式:>d<-outer(a,b,'*')注意outer(a,b,f)是一個(gè)一般性的外積函數(shù),它可以把a(bǔ)的任一個(gè)元素與b的任意一個(gè)元素搭配起來作為f的自變量計(jì)算得到新的元素值,外積是兩個(gè)元素相乘的情況。函數(shù)當(dāng)然也可以是加、減、除,或其它一般函數(shù)。當(dāng)函數(shù)為乘積時(shí)可以省略不寫。數(shù)組的外積

例如,我們希望計(jì)算函數(shù)在一個(gè)x和y的網(wǎng)格上的值用來繪制三維曲面圖,可以用如下方法生成網(wǎng)格及函數(shù)值:>x<-seq(-2,2,length=20)>y<-seq(-pi,pi,length=20)>f<-function(x,y)cos(y)/(1+x^2)>z<-outer(x,y,f)persp(x,y,z)

用這個(gè)一般函數(shù)可以很容易地把兩個(gè)數(shù)組的所有元素都兩兩組合一遍進(jìn)行指定的運(yùn)算。例子:考慮簡單的2×2矩陣,其元素均在0,1,...,9中取值。假設(shè)四個(gè)元素a,b,c,d都是相互獨(dú)立的服從離散均勻分布的隨機(jī)變量,我們?cè)O(shè)法求矩陣行列式ad-bc的分布。首先,隨機(jī)變量ad和bc同分布,它的取值由以下外積矩陣給出,每一個(gè)取值的概率均為1/100:>x<-outer(0:9,0:9)這個(gè)語句產(chǎn)生一個(gè)10×10的外積矩陣。為了計(jì)算ad的100個(gè)值(有重復(fù))與bc的100個(gè)值相減得到的10000個(gè)結(jié)果,可以使用如下外積函數(shù):>y<-outer(x,x,"-")這樣得到一個(gè)維數(shù)向量為c(10,10,10,10)的四維數(shù)組,每一個(gè)元素為行列式的一個(gè)可能取值,概率為萬分之一。因?yàn)檫@些取值中有很多重復(fù),我們可以用一個(gè)table()函數(shù)來計(jì)算每一個(gè)值的出現(xiàn)次數(shù)(頻數(shù)):>f<-table(y)得到的結(jié)果是一個(gè)帶有元素名的向量f,f的元素名為y的一個(gè)取值,f的元素值為y該取值出現(xiàn)的頻數(shù),比如f[1]的元素名為-81,值為19,表示值-81在數(shù)組d2中出現(xiàn)了19次。通過計(jì)算length(f)可以知道共有163個(gè)不同值。還可以把這些值繪制一個(gè)頻數(shù)分布圖(除以10000則為實(shí)際概率):>plot(as.numeric(names(f)),f,type="h",xlab=“行列式值",ylab="頻數(shù)")其中as.numeric()把向量f中的元素名又轉(zhuǎn)換成了數(shù)值型,用來作為作圖的橫軸坐標(biāo),f中的元素值即頻數(shù)作為縱軸,type="h"表示是畫垂線型圖。

plot(as.numeric(names(f)),f,type='h',xlab='行列式值',ylab='頻數(shù)')

plot(as.numeric(names(f)),f/10000,type='h',xlab='行列式值',ylab='頻率')

數(shù)組的廣義轉(zhuǎn)置

可以用aperm(a,perm)函數(shù)把數(shù)組a的各維按perm中指定的新次序重新排列。例如:

>a<-array(1:24,dim=c(2,3,4))>b<-aperm(a,c(2,3,1))

結(jié)果a的第2維變成了b的第1維,a的第3維變成了b的第2維,a的第1維變成了b的第3維。注意這時(shí)a[i1,i2,i3]=b[i2,i3,i1].對(duì)于矩陣a,aperm(a,c(2,1))恰好是矩陣轉(zhuǎn)置。對(duì)于矩陣轉(zhuǎn)置可以簡單地用t(a)表示。

>c<-aperm(a,c(2,1))>a=array(1:12,dim=c(2,3,2))>a,,1[,1][,2][,3][1,]135[2,]246,,2[,1][,2][,3][1,]7911[2,]81012>aperm(a,c(3,2,1)),,1[,1][,2][,3][1,]135[2,]7911,,2[,1][,2][,3][1,]246[2,]81012>aperm(a,c(2,1,3)),,1[,1][,2][1,]12[2,]34[3,]56,,2[,1][,2][1,]78[2,]910[3,]1112

apply函數(shù)對(duì)于向量,我們有sum、mean等函數(shù)對(duì)其進(jìn)行計(jì)算。對(duì)于數(shù)組,如果我們想對(duì)其中一維(或若干維)進(jìn)行某種計(jì)算,可以用apply函數(shù)。其一般形式為:apply(X,MARGIN,FUN,...)其中X為一個(gè)數(shù)組,MARGIN是固定哪些維不變,F(xiàn)UN是用來計(jì)算的函數(shù)。例如,設(shè)a是n*m矩陣,則apply(a,1,sum)的意義是對(duì)a的各行求和(保留第一維即第一個(gè)下標(biāo)不變),結(jié)果是一個(gè)長度為3的向量(與第一維長度相同),而apply(a,2,sum)意義是對(duì)a的各列求和,結(jié)果是一個(gè)長度為4的向量(與第二維長度相同)。如果函數(shù)FUN的結(jié)果是一個(gè)標(biāo)量,MARGIN只有一個(gè)元素,則apply的結(jié)果是一個(gè)向量,其長度等于MARGIN指定維的長度,相當(dāng)于固定MARGIN指定的那一維的每一個(gè)值而把其它維取出作為子數(shù)組或向量送入FUN中進(jìn)行運(yùn)算。如果MARGIN指定了多個(gè)維,則結(jié)果是一個(gè)維數(shù)向量等于dim(X)[MARGIN]的數(shù)組。如果函數(shù)FUN的結(jié)果是一個(gè)長度為N的向量,則結(jié)果是一個(gè)維數(shù)向量等于c(N,dim(X)[MARGIN])的數(shù)組,注意這時(shí)不論是對(duì)哪一維計(jì)算,結(jié)果都放在了第一維。所以,若我們要把4×3矩陣a的3列分別排序,只要用apply(a,2,sort),這樣對(duì)每一列排序得到一個(gè)長度為4的向量,用第一維來引用,結(jié)果的維向量為c(N,dim(a)[2])=c(4,3),保留了列維,恰好得到所需結(jié)果,運(yùn)行如下例:>a<-cbind(c(4,9,1),c(3,7,2))>a=cbind(c(4,9,1),c(3,7,2))>a[,1][,2][1,]43[2,]97[3,]12>apply(a,2,sum)[1]1412>apply(a,1,sum)[1]7163>apply(a,2,sort)[,1][,2][1,]12[2,]43[3,]97>apply(a,1,sort)[,1][,2][,3][1,]371[2,]492>t(apply(a,1,sort))[,1][,2][1,]34[2,]79[3,]12>apply(a,2,sort)>但是,如果要對(duì)行排序,則apply(a,1,sort)把a(bǔ)的每一行3個(gè)元素排序后的結(jié)果用第一維來引用,結(jié)果的維向量為c(N,dim(a)[1])=c(3,4),把原來的列變成了行,所以t(apply(a,1,sort))才是對(duì)a的每一行排序的結(jié)果。如:>apply(a,1,sort)>t(apply(a,1,sort))

上面我們只用了矩陣(二維數(shù)組)作為例子講解apply的用法。實(shí)際上,apply可以用于任意維數(shù)的數(shù)組,函數(shù)FUN也可以是任意可以接收一個(gè)向量或數(shù)組作為第一自變量的函數(shù)。比如,設(shè)x是一個(gè)維數(shù)向量為c(2,3,4,5)的數(shù)組,則apply(x,c(1,3),sum)可以產(chǎn)生一個(gè)2行4列的矩陣,其每一元素是x中固定第1維和第3維下標(biāo)取出子數(shù)組求和的結(jié)果。上機(jī)實(shí)習(xí)一1、六個(gè)元素a,b,c,d,e,f都是相互獨(dú)立的服從離散均勻分布的隨機(jī)變量,其元素均在1,...,9中取值。設(shè)法求ade-bcf的分布。要求

(1)產(chǎn)生一個(gè)外積矩陣;(2)用一個(gè)table()函數(shù)來估計(jì)每一個(gè)值的出現(xiàn)概率;(3)繪制一個(gè)頻數(shù)分布圖,一個(gè)頻率分布圖。要求:需給出程序、結(jié)果,存成word文檔發(fā)送:Email:ahualian@126.com2.(1)寫出元素為3,-1.5,3E-10的向量。(2)寫出從3開始每次增加3,長度為100的向量。(3)寫出(0,2)重復(fù)10次的向量。(4)對(duì)向量x,寫出其元素大于等于0小于1的條件。(5)對(duì)向量x,寫出其元素都等于0的條件。(6)寫出包含12個(gè)月份名稱的向量。(7)寫出包含方程的根的向量,并寫出其幅角的余弦和正弦值。3.設(shè)x為一個(gè)長100的整數(shù)向量。比如,x<-floor(100*runif(100))。(1)顯示x第21到30號(hào)元素。(2)把x第31,35,39號(hào)元素賦值為0。(3)顯示x中除了第1號(hào)和第50號(hào)的元素之外的子集。(4)列出x中個(gè)位數(shù)等于3的元素。(5)列出x中個(gè)位數(shù)等于3的元素的下標(biāo)位置。Hint:usewhich()(6)給x的每一個(gè)元素加上名字,為x1到x100。(7)求x的平均值并求每一個(gè)元素減去平均值后的離差,計(jì)算x元素的平方和及離差平方和。(8)把x從大到小排序。計(jì)算x的10%分位數(shù)到90%分位數(shù)之間的距離。4.定義一個(gè)維數(shù)為(3,4,2)的數(shù)組其第一層(第三下標(biāo)為1)取從1開始的奇數(shù),第二層取從2開始的偶數(shù)。顯示每一層的第2行元素。把第(1,1,1),(2,2,2),(2,2,1)號(hào)元素賦值為零。把第一層加上100,把第二層加上200。分別計(jì)算第一層和第二層的平均值。5.試畫出任一給定的二元正態(tài)分布的密度函數(shù)圖形。如二元標(biāo)準(zhǔn)正態(tài)分布等因子(factor)和有序因子

統(tǒng)計(jì)中的變量重要類別:

區(qū)間變量和名義變量、有序變量。區(qū)間變量取連續(xù)的數(shù)值,可以進(jìn)行求和、平均等運(yùn)算。名義變量和有序變量取離散值,既可用數(shù)值表示也可取字符型值,其具體數(shù)值沒有數(shù)量意義,不能用于加減乘除計(jì)算而只能用來分類或者計(jì)數(shù)。名義變量比如性別、省份、職業(yè),有序變量比如班級(jí)名次、質(zhì)量等級(jí)等。因?yàn)殡x散變量有各種不同表示方法,在S中為統(tǒng)一起見使用因子(factor)來表示這種分類變量。還提供了有序因子(orderedfactor)來表示有序變量。因子是一種特殊的字符型向量,其中每一個(gè)元素取一組離散值中的一個(gè),而因子對(duì)象有一個(gè)特殊屬性levels表示這組離散值(用字符串表示)。例如:>x=c("男","女","男","男","女")>y<-factor(x)>y[1]男女男男女

Levels:男女函數(shù)factor()用來把一個(gè)向量編碼成為一個(gè)因子。一般形式為:factor(x,levels=sort(unique(x),na.last=TRUE),labels=c("男","女"),exclude=NA,ordered=FALSE)可以自行指定各離散取值水平(levels),不指定時(shí)由x的不同值來求得。labels可以用來指定各水平的標(biāo)簽,不指定時(shí)用各離散取值的對(duì)應(yīng)字符串。exclude參數(shù)用來指定要轉(zhuǎn)換為缺失值(NA)的元素值集合。如果指定了levels,則因子的第i個(gè)元素當(dāng)它等于水平中第j個(gè)時(shí)元素值取“j”,如果它的值沒有出現(xiàn)在levels中則對(duì)應(yīng)因子元素值取NA。ordered取真值時(shí)表示因子水平是有次序的(按編碼次序)??梢杂胕s.factor()檢驗(yàn)對(duì)象是否因子,用as.factor()把一個(gè)向量轉(zhuǎn)換成一個(gè)因子。>x=c(1,0,1,1,0)>y=factor(x,levels=sort(unique(x),decreasing=T),labels=c("男","女"),exclude=NA,order=F)>y[1]男女男男女

Levels:男女

>x=c(1,0,1,1,0,2)y=factor(x,levels=c(1,0),labels=c("男","女"),exclude=NA,order=F)>y[1]男女男男女<NA>Levels:男女因子的基本統(tǒng)計(jì)是頻數(shù)統(tǒng)計(jì),用函數(shù)table()來計(jì)數(shù)。例如,>sex=factor(c("男","女","男","男","女"))>res.tab<-table(sex)>res.tab

男女

32

表示男性3人,女性2人。table()的結(jié)果是一個(gè)帶元素名的向量,元素名為因子水平,元素值為該水平出現(xiàn)的頻數(shù)。S的結(jié)果除了可以顯示外,本身都是S對(duì)象(如這里的向量結(jié)果),可以很方便地進(jìn)一步處理??梢杂脙蓚€(gè)或多個(gè)因子進(jìn)行交叉分類。比如,性別(sex)和職業(yè)(job)交叉分組可以用table(sex,job)來統(tǒng)計(jì)每一交叉類的頻數(shù),結(jié)果為一個(gè)矩陣,矩陣帶有行名和列名,分別為兩個(gè)因子的各水平名。因子可以用來作為另外的同長度變量的分類變量。比如,假設(shè)上面的sex是5個(gè)學(xué)生的性別,而

>h<-c(165,170,168,172,159)是這5個(gè)學(xué)生的身高,則

>tapply(h,sex,mean)

可以求按性別分類的身高平均值。這樣用一個(gè)等長的因子向量對(duì)一個(gè)數(shù)值向量分組的辦法叫做不規(guī)則數(shù)組(raggedarray)。后面我們還可以看到更多的因子的應(yīng)用。列表(list)定義

列表是一種特別的對(duì)象集合,它的元素也由序號(hào)(下標(biāo))區(qū)分,但是各元素的類型可以是任意對(duì)象,不同元素不必是同一類型。元素本身允許是其它復(fù)雜數(shù)據(jù)類型,比如,列表的一個(gè)元素也允許是列表。列表元素用“列表名[[下標(biāo)]]”的格式引用。但是,列表不同于向量,我們每次只能引用一個(gè)元素,如rec[[1:2]]的用法是不允許的。注意:“列表名[下標(biāo)]”或“列表名[下標(biāo)范圍]”的用法也是合法的,但其意義與用兩重括號(hào)的記法完全不同,兩重記號(hào)取出列表的一個(gè)元素,結(jié)果與該元素類型相同,如果使用一重括號(hào),則結(jié)果是列表的一個(gè)子列表(結(jié)果類型仍為列表)。>rec=list(name="李明",age=30,scores=c(85,76,90))>rec$name[1]"李明"$age[1]30$scores[1]857690>rec[1]$name[1]"李明">rec[[1]][1]"李明">rec[2]$age[1]30>rec[[2]][1]30

>rec[3]$scores[1]857690>rec[[3]][1]857690>rec[[3]][1:2][1]8576>mode(rec[1])>mode(rec[[1]])在定義列表時(shí)如果指定了元素的名字(如rec中的name,age,scores),則引用列表元素還可以用它的名字作為下標(biāo),格式為“列表名[["元素名"]]”,如:

>rec[["age"]][1]30另一種格式是“列表名$元素名”,如:

>rec$age[1]30

其中“元素名”可以簡寫到與其它元素名能夠區(qū)分的最短程度,比如“rec$s”可以代表“rec$score”。這種寫法方便了交互運(yùn)行,編寫程序時(shí)一般不用簡寫,以免降低程序的可讀性。使用元素名的引用方法可以讓我們不必記住某一個(gè)下標(biāo)代表那一個(gè)元素,而直接用易記的元素名來引用元素。事實(shí)上,已知向量和矩陣都可以指定元素名、行名、列名。定義列表使用list()函數(shù),每一個(gè)自變量變成列表的一個(gè)元素,自變量可以用“名字=值”的方式給出,即給出列表元素名。自變量的值被復(fù)制到列表元素中,自變量如果是變量并不會(huì)與該列表元素建立關(guān)系(改變?cè)摿斜碓夭粫?huì)改變自變量的值)。(例見后)修改列表列表的元素可以修改,只要把元素引用賦值即可。如:>rec$age<-45

甚至>rec$age<-list(19,29,31)(可以任意修改一個(gè)列表元素)。如果被賦值的元素原來不存在,則列表延伸以包含該新元素。例如,rec現(xiàn)在共有三個(gè)元素,我們定義一個(gè)新的命名元素,則列表長度變?yōu)?,再定義第六號(hào)元素則列表長度變?yōu)?:

>rec$sex<-"男">rec[[6]]<-161>rec>rec$sex<-"男">rec[[6]]<-161>rec

$name[1]"李明"$age[1]30$scores[1]857690$sex[1]"男"[[5]]NULL[[6]][1]161>sex<-"男">rec1<-list(sex,161)>rec1>rec1[[1]]="女">rec1>sex第五號(hào)元素因?yàn)闆]有定義所有其值是“NULL”,這是空對(duì)象的記號(hào)。如果rec是一個(gè)向量,則其空元素為“NA”,這是缺失值的記號(hào)。從這里我們也可以體會(huì)“NULL”與“NA”的區(qū)別。幾個(gè)列表可以用連接函數(shù)c()連接起來,結(jié)果仍為一個(gè)列表,其元素為各自變量的列表元素。如:>list.ABC<-c(list.A,list.B,list.C)(注意在S中句點(diǎn)是名字的合法部分,一般沒有特殊意義。)幾個(gè)返回列表的函數(shù)

列表的重要作用是把相關(guān)的若干數(shù)據(jù)保存在一個(gè)數(shù)據(jù)對(duì)象中,這樣在編寫函數(shù)時(shí)我們就可以返回這樣一個(gè)包含多項(xiàng)輸出的列表。因?yàn)楹瘮?shù)的返回結(jié)果可以完整地存放在一個(gè)列表中,我們可以繼續(xù)對(duì)得到的結(jié)果進(jìn)行分析,這是S比SAS靈活的一個(gè)地方。下面給出幾個(gè)返回列表的例子。一、特征值和特征向量函數(shù)eigen(x)對(duì)對(duì)稱矩陣x計(jì)算其特征值和特征向量,返回結(jié)果為一個(gè)列表,列表的兩個(gè)成員(元素)為values和vectors。例如:>ev=eigen((1:3)%o%(1:3))>ev$values[1]1.400000e+019.176554e-16-1.023391e-15$vectors[,1][,2][,3][1,]-0.26726120.60677750.7485937[2,]-0.53452250.5530299-0.6390960[3,]-0.8017837-0.57094570.1765328特征向量按矩陣存放,每一列為一個(gè)特征向量。二、奇異值分解及行列式svd()函數(shù)進(jìn)行奇異值分解自學(xué)三、最小二乘擬合與QR分解函數(shù)lsfit(x,y)返回最小二乘擬合的結(jié)果。最小二乘的模型為線性模型

lsfit(x,y)的第一個(gè)參數(shù)x為模型中的設(shè)計(jì)陣,第二個(gè)參數(shù)y為模型中的因變量y(可以是一個(gè)向量也可以是一個(gè)矩陣),返回一個(gè)列表,成員coefficients為上面模型的最小二乘系數(shù),成員residuals為擬合殘差,成員intercept用來指示是否有截距項(xiàng),成員qr為設(shè)計(jì)陣的QR分解,它本身又是一個(gè)列表。三、最小二乘擬合與QR分解關(guān)于最小二乘擬合還可參見ls.diag()函數(shù)(查看幫助)。函數(shù)qr(x)返回x的QR分解結(jié)果。矩陣X的QR分解為X=Q*R,Q為對(duì)角線元素都等于1的下三角陣,R為上三角陣。函數(shù)結(jié)果為一個(gè)列表,成員qr為一個(gè)矩陣,其上三角部分(包括對(duì)角線)分解的R,其下三角部分(不包括對(duì)角線)為分解的Q。其它成員為一些輔助信息。>x=rbind(c(1,2,3),c(4,5,6),c(7,8,9))>y=qr(x)>y>qr.R(y)>qr.Q(y)>qr.Q(y)%*%qr.R(y)>x=rbind(c(1,2,3),c(4,5,6),c(7,8,9))>y=qr(x)>y$qr[,1][,2][,3][1,]-8.1240384-9.6011363-1.107823e+01[2,]0.4923

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(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)論