R軟件第二講-數據操作_第1頁
R軟件第二講-數據操作_第2頁
R軟件第二講-數據操作_第3頁
R軟件第二講-數據操作_第4頁
R軟件第二講-數據操作_第5頁
已閱讀5頁,還剩79頁未讀 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

R向量、多維數組和矩陣1、數據表示2、應用實例3、實驗練習實驗內容實驗目的學習R中向量、多維數組和矩陣的表示方法常量

常量為:數值型、邏輯型和字符型三種,其中數值型數據如:123,123.45,1.2345e30字符型如:“Weight”,“李明”是字符型;邏輯真值寫為T或TRUE(注意區(qū)分大小寫,寫t或true都沒意義),邏輯假值寫為F或FALSE。復數常量就用3.5-2.1i這樣的寫法表示。R中的數據可以取缺失值,用符號NA代表缺失值。函數is.na(x)返回x是否缺失值(返回值T或F)。向量(Vector)與賦值

向量是有相同基本類型的元素序列,即一維數組定義向量的最常用辦法是使用函數c(),它把若干個數值或字符串組合為一個向量,比如:>x<-c(1:3,10:13)

>x

[1]12310111213

R中用符號“<-”、“=”來為變量賦值。另一種賦值的辦法是用assign函數,比如>x1=c(1,2)和>assign(“x1”,c(1,2))相同函數length(x)可以計算向量x的長度。向量運算

可以對向量進行加(+)減(-)乘(*)除(/)、乘方(^)運算,其含意是對向量的每一個元素進行運算。例如:

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

[1]3.09.013.5

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

%%表示求余數(如5%%3為2)??梢杂孟蛄孔鳛楹瘮底宰兞浚?/p>

sqrt、log、exp、sin、cos、tan等函數都可以用向量作自變量,結果是對向量的每一個元素取相應的函數值函數min和max分別取向量自變量的最小值和最大值,函數sum計算向量自變量的元素和,函數mean計算均值,函數var計算樣本方差(分母為n-1),函數sd計算標準差如果求var(x)而x是矩陣,則結果為樣本協(xié)方差陣。(行向量為觀測值)負數開根號要補充成復數形式>sqrt(-4)[1]NaNwarning:……>sqrt(-4+0i)[1]2isort(x)返回x的元素從小到大排序的結果向量

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

>x=c(2,4,8,6,10)

>order(x)[1]12435

>x[order(x)][1]246810任何數與缺失值的運算結果仍為缺失值。例如,>2*c(1,NA,2)[1]2NA4

>sum(c(1,NA,2))[1]NA

最大最小值及其查詢>x<-c(5,2,4,1,10)>min(x)[1]2>max(x)[1]10>which.min(x)[1]4>which.max(x)[1]5

>range(x)[1]110產生有規(guī)律的數列在R中很容易產生一個等差數列。例如,1:n產生從1到n的整數列,

-2:3產生從-2到3的整數列,

5:2產生反向的數列:注意優(yōu)先級

1:n-1不是代表1到n-1而是向量1:n減去1,>1:n-1

[1]01234>1:(n-1)

[1]1234

seq函數是更一般的等差數列函數。如只指定一個自變量n>0,則seq(n)相當于1:n。指定兩個自變量時,第一量是開始值,第二量是結束值,如seq(-2,3)是從-2到3,默認公差為1。R函數調用的一個很好的特點是它可以使用不同個數的自變量,函數可以對不同類型的自變量給出不同結果,自變量可以用“自變量名=自變量值”的形式指定。例如,seq(-2,3)可以寫成seq(from=-2,to=3)??梢杂靡粋€by參數指定等差數列的增加值,例如:

>seq(0,2,0.7)

[1]0.00.71.4

也可以寫成>seq(from=0,to=2,by=0.7)。參數的位置可以互換有參數名的參數的次序任意,如:

>seq(0,by=0.7,to=2)[1]0.00.71.4

可以用length參數指定數列長度,如>seq(from=10,length=5)產生10到14。seq函數還可以用一種seq(along=向量名)的格式,這時只能用這一個參數,產生該向量的下標序列,如:

>x

[1]1.004.006.25

>seq(along=x)[1]123

也可以加入by這個參數另一個類似的函數是rep,它可以重復第一個自變量若干次,例如:

>rep(x,3)

[1]1.004.006.251.004.006.251.004.006.25

第一個參數名為x,第二個參數名為times(重復次數)。>rep(x,each=3)[1]1.001.001.004.004.004.006.256.256.25此外numeric(n)可以產生一個長度為n的零向量

向量可以取邏輯值,如:

>a=c(T,T,F)>a[1]TRUETRUEFALSE

當然,邏輯向量往往是一個比較的結果,如:

>x<-c(1.00,4.00,6.25)>b=x>3>b

[1]FALSETRUETRUE邏輯向量

一個向量與常量比較大小,結果還是一個向量,元素為每一對比較的結果邏輯值。兩個向量也可以比較,如:

>log(10*x)[1]2.3025853.6888794.135167

>log(10*x)>x

[1]TRUEFALSEFALSE

比較運算符包括<,<=,>,>=,==,!=。兩個邏輯向量可以進行與(&)、或(|)運算,結果是對應元素運算的結果。對邏輯向量x計算!x表示取每個元素的非。例如:>x=c(1,4,6.25,1.6)>(x>1.5)&(x<3)

[1]FALSEFALSEFALSETRUE

判斷一個邏輯向量是否都為真值的函數是all,如:>all(log(10*x)>x)[1]FALSE

判斷是否其中有真值的函數是any,如:

>any(log(10*x)>x)[1]TRUE

函數is.na(x)用來判斷x的每一個元素是否缺失。如>is.na(c(1,NA,3))

[1]FALSETRUEFALSE

邏輯值可以強制轉換為整數值,TRUE變成1,FALSE變成0。例如,age>65為老年人,否則為年輕人,可以用c(“young”,“old”)[(age>65)+1]表示。當年齡大于65時age>65等于TRUE,加1則把TRUE轉換為數值型的1,結果得2,于是返回第二個下標處的“old”。否則等于0+1下標處的“young”。

>age=c(89,20,10,66);c('young','old')[(age>65)+1];

[1]"old""young""young""old"

缺失數據NA表示缺失、NaN表示不確定的數注意下面例子的比較

>x<-c(0/1,0/0,1/0,NA);x[1]0NaNInfNA>is.nan(x)[1]FALSETRUEFALSEFALSE>is.na(x)[1]FALSETRUEFALSETRUE>is.finite(x)[1]TRUEFALSEFALSEFALSE>is.infinite(x)[1]FALSEFALSETRUEFALSE字符型向量

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

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

[1]"x""sin(x)"

>ns=c("Weight","Height",“age")>ns

[1]"Weight""Height""age"

paste函數用來把它的自變量連成一個字符串,中間用空格分開,例如:>paste("My","Job")

[1]"MyJob">paste('Hi',‘Goodmorning')

[1]"HiGoodmorning"連接的自變量可以是向量,這時各對應元素連接起來,長度不相同時較短的向量被重復使用。自變量可以是數值向量,連接時自動轉換成適當的字符串表示,例如:>paste(c("X","Y"),"=",1:4)

[1]"X=1""Y=2""X=3""Y=4"

分隔用的字符可以用sep參數指定,例如:

>paste('result.',1:5,sep="")[1]"result.1""result.2""result.3""result.4""result.5"

如果給paste()函數指定了collapse參數,則把字符串向量的各個元素連接成一個字符串,中間用collapse指定的值分隔。比如

>paste(c('a','b'),collapse='.')

[1]'a.b'還可以和日期函數一起合并,顯示當天的日歷和時間>paste(“Todayis”,date())[1]“TodayisMonSep2019:20:352010”復數向量

R支持復數運算。復數常量只要用3.5+2.1i這樣的格式即可。復向量的每一個元素都是復數。

Re()計算實部,Im()計算虛部,

Mod()計算復數模,Arg()計算復數幅角。>complex(2)[1]0+0i0+0i>complex(2,4,6)[1]4+6i4+6i>complex(1,4,6)[1]4+6i>y=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向量下標運算

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

>x[1]1.004.006.25

>x[2][1]4

>(c(1,3,5)+5)[2][1]8可以單獨改變一個元素的值,例如:>x[2]<-125>x[1]1.00125.006.25R提供了四種方法來訪問向量的一部分,格式為x[v],x為向量名或向量值的表達式,v是如下的表示下標向量:一、取正整數值的下標向量

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

>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"

二、取負整數值的下標向量

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

>x[-(1:2)][1]6.25

>x[-3][1]1.00125.00三、取邏輯值的下標向量

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

>x

[1]1.00125.006.25

>x<10

[1]TRUEFALSETRUE>x[x<10]

[1]1.006.25#取出所有小于10的元素組成子集>x[x<0]

[1]numeric(0)#下標都是F,是個零長度的向量邏輯值下標是一種強有力的檢索工具,例如x[sin(x)>0]可以取出x中所有正弦函數值為正的元素組成的向量。四、取字符型值的下標向量在定義向量時可以給元素加上名字,例如:

>ages<-c(Li=33,Zhang=29,Liu=18)>ages

[1]LiZhangLiu332918

>ages[1][1]Li33>ages[1]=2#可以改變向量中字符型元素取值>ages[1][1]Li2

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

[1]LiLiu3318向量元素名可以后加,利用names(),

例如:>ages1=c(33,29,18)>names(ages1)=c("Li","Zhang","Liu")>ages1[1]LiZhangLiu332918

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

[1]144125169

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

[1]01250

要把向量所有元素賦為一個相同的值而又不想改變其長度,可以用x[]的寫法:>x[]=0

注意這與“x=0”是不同的,前者賦值后向量長度不變,后者使向量變?yōu)闃肆?。改變部分元素值的技術與邏輯值下標方法結合可以定義向量的分段函數,例如:要定義y=f(x)為當x<0時取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)為當x<3.0時取x,3.0=<x<3.5時取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;[1]0.5-1.01.02.03.04.01.02.03.04.0>y;[1]0.5-1.01.02.013.024.01.02.013.024.0對象和它的模式與屬性R是一種基于對象(object)的語言,它的對象包含了若干元素作為其數據,還有一些特殊數據稱為屬性(attribute),一個向量是一個對象,一個圖形也是一個對象。R的對象分為單純型(atomic)和復合型(recursive)

單純型:所有的元素都是同一種基本類型,如字符串向量,數值型向量都是單純型

復合型:元素可以是不同類型的對象,如列表(list),可以由不同類型的對象組成其元素,元素可以以它們各自單獨的方式被列出。注意:空向量也有自己的模式,如:空的字符串會顯示為:character(0)空的數值向量會顯示為:numeric(0)R的對象還有一種特殊的空值型(null)>z<-NULL;#表示沒有值,和NA不同,NA是有空值,NULL是根本沒有固有屬性:模式(mode)和長度(length)

R的對象有兩個基本的屬性:類型屬性(mode)和長度屬性(length)。>x<-c(1,4,6.25);>mode(x)[1]“numeric”>mode(x>1)[1]“l(fā)ogical”>length(x)[1]3長度為零的向量numeric()或者numeric(0)character()或者character(0)R允許強制轉換對象的類型>x<-as.character(x);x[1]“1”“4”“6.25”>x<-as.numeric(x);x

[1]1.004.006.25as.開頭的函數,帶有強制轉換類型的功能(具體可參加索引部分)R允許修改對象的長度對象的長度可以為0或正整數值>y<-numeric();y[2]<-1;y[1]NA1>z[2]<-1;z

[1]NA1如果要增加對象的長度,可以通過賦值>x[4]<-125;x

[1]1.004.006.26125.00如果要縮短對象的長度,取一個長度短的子集>x<-x[1:3];x[1]1.004.006.25>x<-x[c(1,3)];x[1]1.006.25還可以通過修改長度參數來達到目的>even<-1:10;>even<-even[2*1:5];even[1]246810>length(even);

[1]5>length(even)<-3;

[1]246特有屬性:attributes()和attr()

attributes()返回對象除了mode和length以外的特有屬性,如果沒有特有屬性,則返回NULL。>fruit<-c(apple=1,orange=2);fruitappleorange12>mode(fruit)[1]“numeric”>attributes(fruit)$names[1]"apple""orange">attributes(x)NULL用attr()可以對對象的特有屬性進行賦值>attr(fruit,"names")<-c("peanut","almond");>fruitpeanutalmond12>attr(fruit,"type")<-"nut";>fruit;peanutalmond12>attributes(fruit)$names[1]"peanut""almond"$type[1]"nut"多維數組和矩陣

數組(array)和矩陣(matrix)

數組(array):

帶多個下標的類型相同的元素的集合,常用的是數值型的數組如矩陣,也可以有其它類型(如字符型、邏輯型、復型數組)。數組有一個特征屬性叫做維數向量(dim屬性),比如維數向量有兩個元素時數組為二維數組(矩陣)。維數向量的每一個元素指定了該下標的上界,下標的下界總為1。向量只有定義了維數向量(dim屬性)后才能被看作是數組。來看下面兩個例子例

>a=1:24>a>dim(a)=c(6,4)#a是6行4列結構的數組>a

[,1][,2][,3][,4][1,]171319[2,]281420[3,]391521[4,]4101622[5,]5111723[6,]6121824>dim(a)<-24;

#對a賦予dim以后,a也是數組了按列的順序例>a=1:24>a>dim(a)=c(2,4,3)>a

,,1[,1][,2][,3][,4][1,]1357[2,]2468,,2[,1][,2][,3][,4][1,]9111315[2,]10121416,,3[,1][,2][,3][,4][1,]17192123[2,]18202224數組元素的排列次序缺省情況下是采用第一下標變化最快,最后下標變化最慢的順序存放的;對于矩陣(二維數組)則是按列存放。例如,假設數組a的元素為1:24,維數向量為c(2,3,4),則各元素次序為a[1,1,1],a[2,1,1],a[1,2,1],a[2,2,1],a[1,3,1],...,a[2,3,4]。用函數array()或matrix()可以更直觀地定義數組。array()函數的完全使用為>array(x,dim=length(x),dimnames=NULL)其中x是第一自變量,應該是一個向量,表示數組的元素值組成的向量。dim參數可省,省略時作為一維數組(但不同于向量)。dimnames屬性可以省略,不省略時是一個長度與維數相同的列表,列表的每個成員為一維的名字。比較下面幾個命令:>x<-c(1,2,3,4);x[1]1234>y<-array(x);y[1]1234>dim(x)NULL>dim(y)[1]4>z<-array(x,dim=c(2,2));>z[,1][,2][1,]13[2,]24>z<-array(x,dim=c(2,2),dimnames=list(c("row1","row2"),c("col1","col2")));

col1col2row113row224函數matrix():用于構造二維數組,即矩陣。格式為matrix(data=NA,nrow=1,ncol=1,byrow=FALSE,dimnames=NULL)

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

dimnames缺省是空值,否則是一個長度為2的列表,列表第一個成員是長度與行數相等的字符型向量,表示每行的標簽,列表第二個成員是長度與列數相同的字符型向量,表示每列的標簽。例如,定義一個3行4列,由1:12按行次序排列的矩陣,可以用:>b<-matrix(1:12,ncol=4,byrow=T);b[,1][,2][,3][,4][1,]1234[2,]5678[3,]9101112

b<-matrix(1:12,ncol=4);b

[,1][,2][,3][,4][1,]14710[2,]25811[3,]36912注意:在有數據的情況下只需指定行數或列數之一。指定的數據個數允許少于所需的數據個數,這時循環(huán)使用提供的數據。例如:>b<-matrix(1,nrow=3,ncol=4)#生成3行4列的的矩陣,元素都是1。

>b<-matrix(c(1,3),nrow=3,ncol=4);[,1][,2][,3][,4][1,]1313[2,]3131[3,]1313數組下標

訪問數組的某個元素,寫出數組名和方括號內用逗號分開的下標即可,如a[2,1,2]。>a<-1:24;>dim(a)<-c(2,4,3);>a[2,1,2][1]10在每一個下標位置寫一個下標向量,表示對這一維取出所有指定下標的元素,如a[1,2:3,2:3]取出所有第一下標為1,第二下標為2或3,第三下標為2或3的元素。>a[1,2:3,2:3]

[,1][,2][1,]1119[2,]1321略寫某一維的下標,則表示該維全選。>a[1,,][,1][,2][,3][1,]1917[2,]31119[3,]51321[4,]71523>a[,2,][,1][,2][,3][1,]31119[2,]41220a[,,]或a[]都表示整個數組。a[]=0把元素都賦成0。還有一種特殊下標是對于數組只用一個下標向量(是向量,不是數組),比如a[3:4],這時忽略數組的維數信息,把下標表達式看作是對數組的數據向量取子集。>a[3:4][1]34不規(guī)則數組下標

可以把數組中的任意位置的元素作為一組訪問,其方法是用一個矩陣作為數組的下標,例如,我們要把上面的形狀為c(2,4,3)的數組a的第[1,1,1],[2,2,3],[1,4,3],[2,4,1]號共四個元素作為一個整體訪問,先定義一個包含這些下標作為行的二維數組:>b=matrix(c(1,1,1,2,2,3,1,4,3,2,4,1),ncol=3,byrow=T)>b

>a[b]

[1]120238>x1<-c(100,200)>x2<-1:6>x1+x2

[1]101202103204105206>x3<-matrix(1:6,nrow=3)>x3>x1+x3

[,1][,2][1,]101204[2,]202105[3,]103206數組四則運算

數組可以進行四則運算(+,-,*,/,^),解釋為數組對應元素的四則運算,參加運算的數組一般應該是相同形狀的(dim屬性完全相同)。例如,假設A,B,C是三個形狀相同的數組,則>D<-C+2*A/B

形狀不一致的向量和數組也可以進行四則運算,一般的規(guī)則是數組的數據向量對應元素進行運算,把短的循環(huán)使用來與長的匹配,并盡可能保留共同的數組屬性。例如:不規(guī)則運算除非你清楚地知道規(guī)則,否則應避免使用這樣的辦法。矩陣運算

矩陣是二維數組,應用廣泛函數t(A)返回矩陣A的轉置。nrow(A)為矩陣A的行數,ncol(A)為矩陣A的列數。矩陣之間進行普通的加減乘除四則運算,即數組的對應元素之間進行運算,所以注意A*B不是矩陣乘法而是矩陣對應元素相乘。要進行矩陣乘法,使用運算符%*%,A%*%B表示矩陣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

另外,向量用在矩陣乘法中可以作為行向量看待也可以作為列向量看待,這要看哪一種觀點能夠進行矩陣乘法運算。例如,設x是一個長度為n的向量,A是一個n*n矩陣,則“x%*%A%*%x”表示二次型。但是,有時向量在矩陣乘法中的地位并不清楚,比如“x%*%x”就既可能表示內積,也可能表示n*n陣。因為前者較常用,所以R選擇表示前者,但內積最好還是用crossprod(x)來計算。要表示n*n陣,可以用“cbind(x)%*%x”或“x%*%rbind(x)”。函數crossprod(X,Y)表示一般的交叉乘積(內積),即X的每一列與Y的每一列的內積組成的矩陣。如果X和Y都是向量則是一般的內積。只寫一個參數X的crossprod(X)計算X自身的內積。其它矩陣運算還有solve(A,b)解線性方程組,solve(A)求方陣A的逆矩陣,svd()計算奇異值分解,qr()計算QR分解,eigen()計算特征向量和特征值。詳見隨機幫助,例如:>?qr函數diag()的作用依賴于其自變量。diag(vector)返回以自變量(向量)為主對角元素的對角矩陣。diag(matrix)返回由矩陣的主對角元素組成的向量。diag(k)(k為標量)返回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>A<-t(array(c(1:8,10),dim=c(3,3)))>b<-c(1,1,1)

>x<-solve(A,b);x

[1]-1.000000e+001.000000e+003.806634e-16>A.inverse<-solve(A);A.inverse[,1][,2][,3][1,]-0.6666667-1.3333331[2,]-0.66666673.666667-2[3,]1.0000000-2.0000001>det(A)[1]-3>svd.A<-svd(A);svd.A#A=UDV',U、V正交陣,D為對角陣$d

#奇異陣對角線的元素[1]17.41250520.87516140.1968665$u[,1][,2][,3][1,]-0.20933730.964385140.1616762[2,]-0.50384850.03532145-0.8630696[3,]-0.8380421-0.262132990.4785099$v[,1][,2][,3][1,]-0.4646675-0.8332863550.2995295[2,]-0.55375460.009499485-0.8326258[3,]-0.69097030.5527599940.4658502>attach(svdA)>u%*%diag(d)%*%t(v)[,1][,2][,3][1,]123[2,]456[3,]7810矩陣合并與拉直

函數cbind()把其自變量橫向拼成一個大矩陣,rbind()把其自變量縱向拼成一個大矩陣。cbind()的自變量是矩陣或者看作列向量的向量,自變量的高度應該相等(對于向量,高度即長度,對于矩陣,高度即行數)。rbind的自變量是矩陣或看作行向量的向量,自變量的寬度應該相等(對于向量,寬度即長度,對于矩陣,寬度即列數)。如果參與合并的自變量比其它自變量短則循環(huán)補足后合并。例如:>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設a是一個數組,要把它轉化為向量(去掉dim和dimnames屬性),只要用函數as.vector(a)

返回值就可以了(注意函數只能通過函數值返回結果而不允許修改它的自變量,比如t(X)返回X的轉置矩陣而X本身并未改變)。另一種由數組得到其數據向量的簡單辦法是使用函數c(),例如c(a)的結果是a的數據向量。這樣的另一個好處是c()允許多個自變量,它可以把多個自變量都看成數據向量連接起來。例如,設A和B是兩個矩陣,則c(A,B)表示把A按列次序拉直為向量并與把B按列次序拉直為向量的結果連接起來。一定注意拉直時是按列次序拉直的。>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#按列拉直數組的維名字

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

>x<-matrix(1:6,ncol=2,dimnames=list(c("one","two","three"),c("First","Second")),byrow=T)>x

FirstSecondone12two34three56我們也可以先定義矩陣x然后再為dimnames(x)賦值。對于矩陣,我們還可以使用屬性rownames和colnames來訪問行名和列名。在定義了數組的維名后我們對這一維的下標就可以用它的名字來訪問,>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數組的外積

兩個數組a和b的外積是由a的每一個元素與b的每一個元素搭配在一起相乘得到一個新元素,這樣得到一個維數向量等于a的維數向量與b的維數向量連起來的數組,>a<-c(1,2,3)>b<-c(2,5,7)>a%o%b[,1][,2][,3][1,]257[2,]41014[3,]61521注意:b%o%a==t(a%o%b)即若d為a和b的外積,則dim(d)=c(dim(a),dim(b))。a和b的外積記作a%o%b。如>d<-a%o%b

也可以寫成一個函數調用的形式:>d<-outer(a,b,'*')

注意outer(a,b,f)是一個一般性的外積函數,它可以把a的任一個元素與b的任意一個元素搭配起來作為f的自變量計算得到新的元素值,外積是兩個元素相乘的情況。函數當然也可以是加、減、除,或其它一般函數。當函數為乘積時可以省略不寫。>outer(a,b,"+")[,1][,2][,3][1,]368[2,]479[3,]5810例如,我們希望計算函數在一個x和y的網格上的值用來繪制三維曲面圖,可以用如下方法生成網格及函數值:>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)

用這個一般函數可以很容易地把兩個數組的所有元素都兩兩組合一遍進行指定的運算。例子:考慮簡單的2×2矩陣,其元素均在0,1,...,9中取值。假設四個元素a,b,c,d都是相互獨立的服從離散均勻分布的隨機變量,我們設法求矩陣行列式ad-bc的分布。首先,隨機變量ad和bc同分布,它的取值由以下外積矩陣給出,每一個取值的概率均為1/100:>x<-outer(0:9,0:9)#兩個向量的各種取值這個語句產生一個10×10的外積矩陣。為了計算ad的100個值(有重復)與bc的100個值相減得到的10000個結果,可以使用如下外積函數:

>y<-outer(x,x,“-”)#兩者想減的各種可能這樣得到一個維數向量為c(10,10,10,10)的四維數組,每一個元素為行列式的一個可能取值,概率為萬分之一。因為這些取值中有很多重復,我們可以用一個table()函數來計算每一個值的出現次數(頻數):>f<-table(y)得到的結果是一個帶有元素名的向量f,f的元素名為y的一個取值,f的元素值為y該取值出現的頻數,比如f[1]的元素名為-81,值為19,表示值-81在數組d2中出現了19次。通過計算length(f)可以知道共有163個不同值。還可以把這些值繪制一個頻數分布圖(除以10000則為實際概率):>plot(as.numeric(names(f)),f,type="h",xlab=“行列式值",ylab="頻數")

其中as.numeric()把向量f中的元素名又轉換成了數值型,用來作為作圖的橫軸坐標,f中的元素值即頻數作為縱軸,type="h"表示是畫垂線型圖。

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

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

數組的廣義轉置

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

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

結果a的第2維變成了b的第1維,a的第3維變成了b的第2維,a的第1維變成了b的第3維。對于矩陣a,aperm(a,c(2,1))恰好是矩陣轉置。對于矩陣轉置可以簡單地用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函數

對于向量,我們有sum、mean等函數對其進行計算。對于數組,如果我們想對其中一維(或若干維)進行某種計算,可以用apply函數。其一般形式為:apply(X,MARGIN,FUN,...)其中X為一個數組,MARGIN是固定哪些維不變,FUN是用來計算的函數。例如,設a是n*m矩陣,則apply(a,1,sum)的意義是對a的各行求和(保留第一維即第一個下標不變),結果是一個長度為n的向量(與第一維長度相同),而apply(a,2,sum)意義是對a的各列求和,結果是一個長度為m的向量(與第二維長度相同)。>>a[,1][,2][1,]43[2,]97[3,]12>apply(a,2,sum)[1]1412>ap

溫馨提示

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

評論

0/150

提交評論