R軟件第二講-數(shù)據(jù)操作_第1頁(yè)
R軟件第二講-數(shù)據(jù)操作_第2頁(yè)
R軟件第二講-數(shù)據(jù)操作_第3頁(yè)
R軟件第二講-數(shù)據(jù)操作_第4頁(yè)
R軟件第二講-數(shù)據(jù)操作_第5頁(yè)
已閱讀5頁(yè),還剩79頁(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)介

R向量、多維數(shù)組和矩陣1、數(shù)據(jù)表示2、應(yīng)用實(shí)例3、實(shí)驗(yàn)練習(xí)實(shí)驗(yàn)內(nèi)容實(shí)驗(yàn)?zāi)康膶W(xué)習(xí)R中向量、多維數(shù)組和矩陣的表示方法常量

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

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

>x

[1]12310111213

R中用符號(hào)“<-”、“=”來(lái)為變量賦值。另一種賦值的辦法是用assign函數(shù),比如>x1=c(1,2)和>assign(“x1”,c(1,2))相同函數(shù)length(x)可以計(jì)算向量x的長(zhǎng)度。向量運(yùn)算

可以對(duì)向量進(jì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ù)值函數(shù)min和max分別取向量自變量的最小值和最大值,函數(shù)sum計(jì)算向量自變量的元素和,函數(shù)mean計(jì)算均值,函數(shù)var計(jì)算樣本方差(分母為n-1),函數(shù)sd計(jì)算標(biāo)準(zhǔn)差如果求var(x)而x是矩陣,則結(jié)果為樣本協(xié)方差陣。(行向量為觀測(cè)值)負(fù)數(shù)開根號(hào)要補(bǔ)充成復(fù)數(shù)形式>sqrt(-4)[1]NaNwarning:……>sqrt(-4+0i)[1]2isort(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

最大最小值及其查詢>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產(chǎn)生有規(guī)律的數(shù)列在R中很容易產(chǎn)生一個(gè)等差數(shù)列。例如,1:n產(chǎn)生從1到n的整數(shù)列,

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

5:2產(chǎn)生反向的數(shù)列:注意優(yōu)先級(jí)

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

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

[1]1234

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

>seq(0,2,0.7)

[1]0.00.71.4

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

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

可以用length參數(shù)指定數(shù)列長(zhǎng)度,如>seq(from=10,length=5)產(chǎn)生10到14。seq函數(shù)還可以用一種seq(along=向量名)的格式,這時(shí)只能用這一個(gè)參數(shù),產(chǎn)生該向量的下標(biāo)序列,如:

>x

[1]1.004.006.25

>seq(along=x)[1]123

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

>rep(x,3)

[1]1.004.006.251.004.006.251.004.006.25

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

向量可以取邏輯值,如:

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

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

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

[1]FALSETRUETRUE邏輯向量

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

>log(10*x)[1]2.3025853.6888794.135167

>log(10*x)>x

[1]TRUEFALSEFALSE

比較運(yùn)算符包括<,<=,>,>=,==,!=。兩個(gè)邏輯向量可以進(jìn)行與(&)、或(|)運(yùn)算,結(jié)果是對(duì)應(yīng)元素運(yùn)算的結(jié)果。對(duì)邏輯向量x計(jì)算!x表示取每個(gè)元素的非。例如:>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]TRUE

函數(shù)is.na(x)用來(lái)判斷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"

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

>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函數(shù)用來(lái)把它的自變量連成一個(gè)字符串,中間用空格分開,例如:>paste("My","Job")

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

[1]"HiGoodmorning"連接的自變量可以是向量,這時(shí)各對(duì)應(yīng)元素連接起來(lái),長(zhǎng)度不相同時(shí)較短的向量被重復(fù)使用。自變量可以是數(shù)值向量,連接時(shí)自動(dòng)轉(zhuǎn)換成適當(dāng)?shù)淖址硎荆纾?gt;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='.')

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

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

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+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向量下標(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.25R提供了四種方法來(lái)訪問向量的一部分,格式為x[v],x為向量名或向量值的表達(dá)式,v是如下的表示下標(biāo)向量:一、取正整數(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

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

v為和x等長(zhǎng)的邏輯向量,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)#下標(biāo)都是F,是個(gè)零長(zhǎng)度的向量邏輯值下標(biāo)是一種強(qiáng)有力的檢索工具,例如x[sin(x)>0]可以取出x中所有正弦函數(shù)值為正的元素組成的向量。四、取字符型值的下標(biāo)向量在定義向量時(shí)可以給元素加上名字,例如:

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

[1]LiZhangLiu332918

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

向量還可用元素名字來(lái)訪問元素或元素子集,>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

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

[1]01250

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

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

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

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

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

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

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

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

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

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

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

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

數(shù)組(array):

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

>a=1:24>a>dim(a)=c(6,4)#a是6行4列結(jié)構(gòu)的數(shù)組>a

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

#對(duì)a賦予dim以后,a也是數(shù)組了按列的順序例>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數(shù)組元素的排列次序缺省情況下是采用第一下標(biāo)變化最快,最后下標(biāo)變化最慢的順序存放的;對(duì)于矩陣(二維數(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()函數(shù)的完全使用為>array(x,dim=length(x),dimnames=NULL)其中x是第一自變量,應(yīng)該是一個(gè)向量,表示數(shù)組的元素值組成的向量。dim參數(shù)可省,省略時(shí)作為一維數(shù)組(但不同于向量)。dimnames屬性可以省略,不省略時(shí)是一個(gè)長(zhǎng)度與維數(shù)相同的列表,列表的每個(gè)成員為一維的名字。比較下面幾個(gè)命令:>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函數(shù)matrix():用于構(gòu)造二維數(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è)長(zhǎng)度為2的列表,列表第一個(gè)成員是長(zhǎng)度與行數(shù)相等的字符型向量,表示每行的標(biāo)簽,列表第二個(gè)成員是長(zhǎng)度與列數(shù)相同的字符型向量,表示每列的標(biāo)簽。例如,定義一個(gè)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注意:在有數(shù)據(jù)的情況下只需指定行數(shù)或列數(shù)之一。指定的數(shù)據(jù)個(gè)數(shù)允許少于所需的數(shù)據(jù)個(gè)數(shù),這時(shí)循環(huán)使用提供的數(shù)據(jù)。例如:>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數(shù)組下標(biāo)

訪問數(shù)組的某個(gè)元素,寫出數(shù)組名和方括號(hào)內(nèi)用逗號(hào)分開的下標(biāo)即可,如a[2,1,2]。>a<-1:24;>dim(a)<-c(2,4,3);>a[2,1,2][1]10在每一個(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的元素。>a[1,2:3,2:3]

[,1][,2][1,]1119[2,]1321略寫某一維的下標(biāo),則表示該維全選。>a[1,,][,1][,2][,3][1,]1917[2,]31119[3,]51321[4,]71523>a[,2,][,1][,2][,3][1,]31119[2,]41220a[,,]或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ù)向量取子集。>a[3:4][1]34不規(guī)則數(shù)組下標(biāo)

可以把數(shù)組中的任意位置的元素作為一組訪問,其方法是用一個(gè)矩陣作為數(shù)組的下標(biāo),例如,我們要把上面的形狀為c(2,4,3)的數(shù)組a的第[1,1,1],[2,2,3],[1,4,3],[2,4,1]號(hào)共四個(gè)元素作為一個(gè)整體訪問,先定義一個(gè)包含這些下標(biāo)作為行的二維數(shù)組:>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數(shù)組四則運(yùn)算

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

形狀不一致的向量和數(shù)組也可以進(jìn)行四則運(yùn)算,一般的規(guī)則是數(shù)組的數(shù)據(jù)向量對(duì)應(yīng)元素進(jìn)行運(yùn)算,把短的循環(huán)使用來(lái)與長(zhǎng)的匹配,并盡可能保留共同的數(shù)組屬性。例如:不規(guī)則運(yùn)算除非你清楚地知道規(guī)則,否則應(yīng)避免使用這樣的辦法。矩陣運(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(當(dāng)然要求A的列數(shù)等于B的行數(shù))。例如:>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è)長(zhǎng)度為n的向量,A是一個(gè)n*n矩陣,則“x%*%A%*%x”表示二次型。但是,有時(shí)向量在矩陣乘法中的地位并不清楚,比如“x%*%x”就既可能表示內(nèi)積,也可能表示n*n陣。因?yàn)榍罢咻^常用,所以R選擇表示前者,但內(nèi)積最好還是用crossprod(x)來(lái)計(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)積。其它矩陣運(yùn)算還有solve(A,b)解線性方程組,solve(A)求方陣A的逆矩陣,svd()計(jì)算奇異值分解,qr()計(jì)算QR分解,eigen()計(jì)算特征向量和特征值。詳見隨機(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>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為對(duì)角陣$d

#奇異陣對(duì)角線的元素[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矩陣合并與拉直

函數(shù)cbind()把其自變量橫向拼成一個(gè)大矩陣,rbind()把其自變量縱向拼成一個(gè)大矩陣。cbind()的自變量是矩陣或者看作列向量的向量,自變量的高度應(yīng)該相等(對(duì)于向量,高度即長(zhǎng)度,對(duì)于矩陣,高度即行數(shù))。rbind的自變量是矩陣或看作行向量的向量,自變量的寬度應(yīng)該相等(對(duì)于向量,寬度即長(zhǎng)度,對(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è)a是一個(gè)數(shù)組,要把它轉(zhuǎn)化為向量(去掉dim和dimnames屬性),只要用函數(shù)as.vector(a)

返回值就可以了(注意函數(shù)只能通過函數(shù)值返回結(jié)果而不允許修改它的自變量,比如t(X)返回X的轉(zhuǎn)置矩陣而X本身并未改變)。另一種由數(shù)組得到其數(shù)據(jù)向量的簡(jiǎn)單辦法是使用函數(shù)c(),例如c(a)的結(jié)果是a的數(shù)據(jù)向量。這樣的另一個(gè)好處是c()允許多個(gè)自變量,它可以把多個(gè)自變量都看成數(shù)據(jù)向量連接起來(lái)。例如,設(shè)A和B是兩個(gè)矩陣,則c(A,B)表示把A按列次序拉直為向量并與把B按列次序拉直為向量的結(jié)果連接起來(lái)。一定注意拉直時(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(即無(wú)此屬性)。以矩陣為例,它有兩個(gè)維:行維和列維。比如,設(shè)x為2行3列矩陣,它的行維可以定義一個(gè)長(zhǎng)度為2的字符向量作為每行的名字,它的列維可以定義一個(gè)長(zhǎng)度為3的向量作為每列的名字,屬性dimnames是一個(gè)列表,列表的每個(gè)成員是一個(gè)維名字的字符向量或NULL。例如:

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

FirstSecondone12two34three56我們也可以先定義矩陣x然后再為dimnames(x)賦值。對(duì)于矩陣,我們還可以使用屬性rownames和colnames來(lái)訪問行名和列名。在定義了數(shù)組的維名后我們對(duì)這一維的下標(biāo)就可以用它的名字來(lái)訪問,>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ù)向量連起來(lái)的數(shù)組,>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

也可以寫成一個(gè)函數(shù)調(diào)用的形式:>d<-outer(a,b,'*')

注意outer(a,b,f)是一個(gè)一般性的外積函數(shù),它可以把a(bǔ)的任一個(gè)元素與b的任意一個(gè)元素搭配起來(lái)作為f的自變量計(jì)算得到新的元素值,外積是兩個(gè)元素相乘的情況。函數(shù)當(dāng)然也可以是加、減、除,或其它一般函數(shù)。當(dāng)函數(shù)為乘積時(shí)可以省略不寫。>outer(a,b,"+")[,1][,2][,3][1,]368[2,]479[3,]5810例如,我們希望計(jì)算函數(shù)在一個(gè)x和y的網(wǎng)格上的值用來(lái)繪制三維曲面圖,可以用如下方法生成網(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)算。例子:考慮簡(jiǎ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è)向量的各種取值這個(gè)語(yǔ)句產(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è)可能取值,概率為萬(wàn)分之一。因?yàn)檫@些取值中有很多重復(fù),我們可以用一個(gè)table()函數(shù)來(lái)計(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ù)值型,用來(lái)作為作圖的橫軸坐標(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))#2行3列4組>b<-aperm(a,c(2,3,1))#3行4列2組

結(jié)果a的第2維變成了b的第1維,a的第3維變成了b的第2維,a的第1維變成了b的第3維。對(duì)于矩陣a,aperm(a,c(2,1))恰好是矩陣轉(zhuǎn)置。對(duì)于矩陣轉(zhuǎn)置可以簡(jiǎ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是用來(lái)計(jì)算的函數(shù)。例如,設(shè)a是n*m矩陣,則apply(a,1,sum)的意義是對(duì)a的各行求和(保留第一維即第一個(gè)下標(biāo)不變),結(jié)果是一個(gè)長(zhǎng)度為n的向量(與第一維長(zhǎng)度相同),而apply(a,2,sum)意義是對(duì)a的各列求和,結(jié)果是一個(gè)長(zhǎng)度為m的向量(與第二維長(zhǎng)度相同)。>>a[,1][,2][1,]43[2,]97[3,]12>apply(a,2,sum)[1]1412>ap

溫馨提示

  • 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ù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 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)論