版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
2.1HelloWorld!2.2R語言運行2.3R語言變量和常量2.4R語言對象基本操作2.5R語言數(shù)據(jù)類型2.6R語言流程控制2.7R語言自定義函數(shù)第2章
R語言編程基礎(chǔ)R語言基礎(chǔ)R語言變量和常量R語言數(shù)據(jù)對象變量、向量、數(shù)組、矩陣、數(shù)據(jù)框、列表控制、循環(huán)if\switch條件語句for\while\repeat循環(huán)語句R語言自定義函數(shù)R語言運行2.1R的HelloWorld>newstr<-"Hello,World!">print(newstr)
[1]"Hello,World!"
>#myfirstRcode提示符注釋賦值2.2R語言運行當(dāng)R啟動時,以下常用packages自動加載:–base:基本函式(IO,敘述統(tǒng)計,etc.)–stats:常用統(tǒng)計分析(t.test,anova,etc.)–methods:定義classesofobjects–utils:基本程序編寫工具–graphics:基本繪圖工具–grDevices:基本繪圖接口–datasets:數(shù)據(jù)范例編寫程序:「文件」「建立新的程序腳本」或直接于「>」后編寫空一行或用分號「;」將指令分開套用已寫好的程序:「文件」「開啟程序腳本」修改或繼續(xù)編寫程序:「文件」「開啟程序腳本」程序包(package)加載:「程序包」「加載程序包」清理窗口:右鍵「清除窗口」「←」、「→」或「=」表輸入前面已執(zhí)行完的指令:「↑」逐一顯示+:程序未完結(jié)就換行會顯示「+」提醒,欲結(jié)束按「Esc」英文字母大小寫視為不同的符號#井字號之后為批注,程序不會執(zhí)行結(jié)束R程序:直接關(guān)閉或指令「q()」ls()列出工作空間中的對象rm()刪除工作空間中的對象rm(list=ls())刪除空間中所有對象save.image()保存工作鏡像sink()將運行結(jié)果保存到指定文件中g(shù)etwd()顯示當(dāng)前工作文件夾setwd()設(shè)定工作文件夾R語言腳本是一系列命令可以先批量的編好程序,或者對別人已經(jīng)編好的程序進(jìn)行修改。之后輸入到控制臺進(jìn)行調(diào)試,以滿足數(shù)據(jù)分析的需求語言高亮顯示在代碼較多的情況下,有時需要對行數(shù)、函數(shù)、括號、函數(shù)選項等進(jìn)行高亮顯示,設(shè)置成不同的顏色,以減少錯誤腳本編輯器R自帶的腳本編輯器RStudio自帶的腳本編輯器Editplus(
)Ultraedit(/)Emacs(/software/emacs/)Notepad++(/)記事本或?qū)懽职宓鹊纫粋€R語言腳本rate<-c(20,22,24,26,28,30,32,34,36,38,40,42)impurity<-c(8.4,9.5,11.8,10.4,13.3,14.8,13.2,14.7,16.4,16.5,18.9,18.5)plot(impurity~rate)reg<-lm(impurity~rate)abline(reg,col="red")summary(reg)如何運行R腳本程序通過source()函數(shù)運行source(“d:/regression.r”)通過R腳本編輯器運行路徑:RGui>File>OpenScript#Ctrl+R運行直接粘貼到R控制臺ctrl+c,ctrl+v2.3R語言常量和變量常量是其值不變的量,包括1234,"abc"等數(shù)值、"rlang"等字符串和邏輯值等基本類型。其中,邏輯真值寫為T或TRUE(注意區(qū)分大小寫,寫t或true都沒意義),邏輯假值寫為F或FALSE。R中還有一些特殊類型的常量,其中NULL表示空值NA(NotAvailable的意思)表示缺失數(shù)據(jù)Inf和-Inf表示正無窮和負(fù)無窮NaN(NotaNumber的意思)表示不是數(shù)字的值變量是其值可變的量,如x<-3,x就是一個變量,當(dāng)x<-4時,x的值被重新賦值為4。變量名由字母、數(shù)字和下劃線組成,變量的第一個字符為字母。R語言變量命名的大原則是:只有字母(區(qū)分大小寫)、數(shù)字、“_”(下劃線)、“.”(英文句號)可以出現(xiàn)。變量長度沒有限制,但不能有中文、空格、連字符”-“的存在。變量命名還要滿足以下條件:不能以數(shù)字或下劃線開頭開頭必須是英文字母或者點可以以點號開頭,但點號后面的符號不能是數(shù)字符號說明 1)> 命令或運算提示符 2)+ 續(xù)行符 3)# 注釋、說明語句字符賦值符號 1)<- 2)=R語言常見運算符+ 加號- 減號* 乘號/ 除號%%取模%/%整除^ 乘方運算優(yōu)先級別遞增+-*/%%,%/%^TRUE==1;FALSE==0基本算術(shù)運算> 大于< 小于>= 大于等于 <= 小于等于== 等于!= 不等于
比較運算得到的結(jié)果是邏輯常量TRUE(真)和FALSE(假)。比較運算符!x 邏輯非當(dāng)前邏輯值取反運算。x&y邏輯與如果兩個表達(dá)式的值均為TRUE,結(jié)果才為TRUE,否則為FALSE。x&&y邏輯與
若x,y為向量只比較第一個元素。x|y邏輯或如果x和y的值均為FALSE,結(jié)果為FALSE,否則為TRUE。向量對每個元素進(jìn)行比較。x||y邏輯或若x和y為向量只比較第一個元素。xor(x,y)異或兩個邏輯值不相同,則異或結(jié)果為真。反之,為假。邏輯運算符思考題
下列()表示的是變量。A.123 B.TRUE C.Inf D.abc下列()不可以作為變量名。A.1a2b B.a1b2 C.a_b D.a.b下列()可以作為變量名。A.TRUE B.Inf C.True D.NaN下列賦值語句錯誤的是()。A.a<-1 B.a=1 C.1=a D.A_1<-”1”R語言是基于對象(Object)的語言基本的數(shù)據(jù)類型有:向量、矩陣、列表等復(fù)雜的數(shù)據(jù)對象有:數(shù)據(jù)框?qū)ο?,時間序列對象,模型對象,圖形對象,等等。這里先介紹下R中數(shù)據(jù)對象的基本屬性和有關(guān)操作。2.4R語言對象基本操作
對象和它的模式與屬性R是一種基于對象的語言,R的對象包括了若干元素作為其數(shù)據(jù),另外,還可以有一些特殊數(shù)據(jù)稱為屬性(attribute),并規(guī)定了一些特定的操作(如打印、繪圖);R對象分為:單純對象、復(fù)合對象單純對象:所有元素都是一種基本類型,復(fù)合對象的元素可以是不同類型的對象;固有屬性:mode和lengthR對象都有兩個基本的屬性:mode(類型)屬性和length(長度)屬性,比如向量的類型為logical(邏輯型)、numeric(數(shù)值型)、complex(復(fù)數(shù)型)、character(字符型),比如:mode(c(1,3,5)>5)R對象有一種特別的null(空值型)型,只有一個特殊的NULL值為這種類型,表示沒有值(不同于NA,NA是一種特殊值,而NULL根本沒有對象值)attributes()和attr()函數(shù)attributes(object)返回對象object的各特殊屬性組成的列表,不包括固有屬性mode和length.例如:x<-c(apple=2.5,orange=2.1);xattributes(x)可以用attr(object,name)的形式存取對象object的名為name的屬性,例如,>attr(x,"names")[1]"apple""orange“也可以把attr()函數(shù)寫作賦值的左邊以改變屬性值或定義新的屬性,例如,對象的class屬性在R中可以用特殊的class屬性來支持面向?qū)ο蟮木幊田L(fēng)格,對象的class屬性用來區(qū)分對象的類,可以寫出通用函數(shù)根據(jù)對象類的不同進(jìn)行不同的操作,比如,print()函數(shù)對于向量和矩陣的顯示方法就不同,plot()函數(shù)對不同類的自變量作不同的圖形。為了暫時去掉一個有類的對象的class屬性,可以使用unclass(object)函數(shù)。對于簡單向量來說,class函數(shù)返回的結(jié)果和mode()函數(shù)一致,但對于矩陣、數(shù)組、數(shù)據(jù)框等數(shù)據(jù)對象,結(jié)果有可能相同,也有可能不同。A<-"Gomphotherium";class(A);##[1]"character"class(c(1,3,5)>5)##[1]"logicald<-data.frame(V1=c(1,2))mode(d)##[1]"list"class(d)##[1]"data.frame"class()函數(shù)是從面向?qū)ο笳Z言的角度返回對象的抽象類,一個數(shù)據(jù)對象可能有多個類,用戶可以自行定義類。mode()函數(shù)返回的是內(nèi)存中數(shù)據(jù)對象的基本類型,一個數(shù)據(jù)對象只能有一個基本數(shù)據(jù)類型(numeric、complex、character、logical、list、function等),用戶無法自行定義。要判斷某對象是否某類型,有許多個類似于is.numeric()的函數(shù)可以完成.-is.numeric(x)用來檢驗對象x是否為數(shù)值型,它返回一個邏輯型結(jié)果.-is.character()可以檢驗對象是否為字符型,等等.如:z<-0:9is.numeric(z)is.character(z)R可以強制進(jìn)行類型轉(zhuǎn)換,例如digits<-as.character(123);digitsd<-as.numeric(digits);d
列出對象與刪除對象
函數(shù)ls()的功能是顯示所有在內(nèi)存中的對象。要在內(nèi)存中刪除某個對象,可利用函數(shù)rm()。rm(list=ls())#刪除內(nèi)存中的所有對象name<-"Carmen"n1<-10n2<-100m<-0.5ls()##[1]"m""n1""n2""name"2.5
R語言數(shù)據(jù)類型
向量是有相同基本類型的元素序列,即一維數(shù)組定義向量的最常用辦法是使用函數(shù)c(),它把若干個數(shù)值或字符串組合為一個向量,比如:>x=c(1:3,10:13)>x[1]12310111213R中用符號“<-”、“=”來為變量賦值。另一種賦值的辦法是用assign函數(shù),比如>x1=c(1,2)和
>assign(“x1”,c(1,2))相同向量(Vector)與賦值數(shù)值型向量運算可以對向量進(jìn)行加(+)減(-)乘(*)除(/)、乘方(^)運算,其含意是對向量的每一個元素進(jì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é)果是對向量的每一個元素取相應(yīng)的函數(shù)值函數(shù)min和max分別取向量自變量的最小值和最大值,函數(shù)sum計算向量自變量的元素和,函數(shù)mean計算均值,函數(shù)var計算樣本方差(分母為n-1),函數(shù)sd計算標(biāo)準(zhǔn)差如果求var(x)而x是矩陣,則結(jié)果為樣本協(xié)方差陣。(行向量為觀測值)任何數(shù)與缺失值的運算結(jié)果仍為缺失值。例如,>2*c(1,NA,2)[1]2NA4>sum(c(1,NA,2))[1]NA產(chǎn)生有規(guī)律的數(shù)列在R中很容易產(chǎn)生一個等差數(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,>n=5;>1:n-1[1]01234>1:(n-1)[1]1234seq函數(shù)是更一般的等差數(shù)列函數(shù)。如只指定一個自變量n>0,則seq(n)相當(dāng)于1:n。指定兩個自變量時,第一量是開始值,第二量是結(jié)束值,如seq(-2,3)是從-2到3,默認(rèn)公差為1。R函數(shù)調(diào)用的一個很好的特點是它可以使用不同個數(shù)的自變量,函數(shù)可以對不同類型的自變量給出不同結(jié)果,自變量可以用“自變量名=自變量值”的形式指定。例如,seq(-2,3)可以寫成seq(from=-2,to=3)。可以用一個by參數(shù)指定等差數(shù)列的增加值,例如:>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函數(shù)還可以用一種seq(along=向量名)的格式,這時只能用這一個參數(shù),產(chǎn)生該向量的下標(biāo)序列,如:
>x[1]1.004.006.25>seq(along=x)[1]123另一個類似的函數(shù)是rep,它可以重復(fù)第一個自變量若干次,例如:
>rep(x,3)[1]1.004.006.251.004.006.251.004.006.25
第一個參數(shù)名為x,第二個參數(shù)名為times(重復(fù)次數(shù))。此外numeric(n)可以產(chǎn)生一個長度為n的零向量
邏輯向量向量可以取邏輯值,如:
>l=c(T,T,F)>l輸出[1]TRUETRUEFALSE
當(dāng)然,邏輯向量往往是一個比較的結(jié)果,如:
>x輸出[1]1.004.006.25>l=x>3>l輸出[1]FALSETRUETRUE一個向量與常量比較大小,結(jié)果還是一個向量,元素為每一對比較的結(jié)果邏輯值。兩個向量也可以比較,如:>log(10*x)[1]2.3025853.6888794.135167>log(10*x)>x輸出[1]TRUEFALSEFALSE
比較運算符包括<,<=,>,>=,==,!=。邏輯向量兩個邏輯向量可以進(jìn)行與(&)、或(|)運算,結(jié)果是對應(yīng)元素運算的結(jié)果。對邏輯向量x計算!x表示取每個元素的非。例如:>x=c(1,4,6.25,1.6)>(x>1.5)&(x<3)[1]FALSEFALSEFALSETRUE注意和(x>1.5)&&(x<3)的區(qū)別判斷一個邏輯向量是否都為真值的函數(shù)是all,如:>all(log(10*x)>x)[1]FALSE判斷是否其中有真值的函數(shù)是any,如:
>any(log(10*x)>x)[1]TRUE邏輯向量
函數(shù)is.na(x)用來判斷x的每一個元素是否缺失。如>is.na(c(1,NA,3))[1]FALSETRUEFALSE邏輯值可以強制轉(zhuǎn)換為整數(shù)值,TRUE變成1,F(xiàn)ALSE變成0。例如,age>65為老年人,否則為年輕人,可以用c(“young”,“old”)[(age>65)+1]表示。當(dāng)年齡大于65時age>65等于TRUE,加1則把TRUE轉(zhuǎn)換為數(shù)值型的1,結(jié)果得2,于是返回第二個下標(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ù)用來把它的自變量連成一個字符串,中間用空格分開,例如:>paste("My","Job")[1]"MyJob">paste('Hi','早')輸出[1]"Hi早"連接的自變量可以是向量,這時各對應(yīng)元素連接起來,長度不相同時較短的向量被重復(fù)使用。自變量可以是數(shù)值向量,連接時自動轉(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ù),則把字符串向量的各個元素連接成一個字符串,中間用collapse指定的值分隔。比如
>paste(c('a','b'),collapse='.')得到'a.b'。兩個或者更多字符串對象根據(jù)元素對應(yīng)關(guān)系拼接一個字符串內(nèi)部元素如何連接復(fù)數(shù)向量R支持復(fù)數(shù)運算。復(fù)數(shù)常量只要用3.5+2.1i這樣的格式即可。復(fù)向量的每一個元素都是復(fù)數(shù)。可以用complex()函數(shù)生成復(fù)向量(見幫助)。
>mydat=complex(real=3.5,imaginary=2.1)>mydat[1]3.5+2.1iRe()計算實部,Im()計算虛部,>Re(mydat)>[1]3.5
>Im(mydat)>[1]2.1
Mod()計算復(fù)數(shù)模,Arg()計算復(fù)數(shù)幅角。>Mod(mydat)[1]4.081666因子向量統(tǒng)計中的變量重要類別:區(qū)間變量和名義變量、有序變量。區(qū)間變量取連續(xù)的數(shù)值,可以進(jìn)行求和、平均等運算。名義變量和有序變量取離散值,既可用數(shù)值表示也可取字符型值,其具體數(shù)值沒有數(shù)量意義,不能用于加減乘除計算而只能用來分類或者計數(shù)。名義變量比如性別、省份、職業(yè),有序變量比如班級名次、質(zhì)量等級等。因為離散變量有各種不同表示方法,在R中為統(tǒng)一起見使用因子(factor)來表示這種分類變量。還提供了有序因子(orderedfactor)來表示有序變量。因子是一種特殊的字符型向量,其中每一個元素取一組離散值中的一個,而因子對象有一個特殊屬性levels表示這組離散值(用字符串表示)。例如:>x<-c("男","女","男","男","女")>y<-factor(x)>y[1]男女男男女
Levels:男女函數(shù)factor()用來把一個向量編碼成為一個因子。一般形式為:factor(x,levels=sort(unique(x),na.last=TRUE),labels,exclude=NA,ordered=FALSE)可以自行指定各離散取值水平(levels),不指定時由x的不同值來求得。labels可以用來指定各水平的標(biāo)簽,不指定時用各離散取值的對應(yīng)字符串。exclude參數(shù)用來指定要轉(zhuǎn)換為缺失值(NA)的元素值集合。如果指定了levels,則因子的第i個元素當(dāng)它等于水平中第j個時元素值取“j”,如果它的值沒有出現(xiàn)在levels中則對應(yīng)因子元素值取NA。ordered取真值時表示因子水平是有次序的(按編碼次序)??梢杂胕s.factor()檢驗對象是否因子,用as.factor()把一個向量轉(zhuǎn)換成一個因子。>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)計是頻數(shù)統(tǒng)計,用函數(shù)table()來計數(shù)。例如,>sex=factor(c("男","女","男","男","女"))>res.tab<-table(sex)>res.tab
男女
32
表示男性3人,女性2人。table()的結(jié)果是一個帶元素名的向量,元素名為因子水平,元素值為該水平出現(xiàn)的頻數(shù)。R的結(jié)果除了可以顯示外,本身都是R對象(如這里的向量結(jié)果),可以很方便地進(jìn)一步處理??梢杂脙蓚€或多個因子進(jìn)行交叉分類。比如,性別(sex)和職業(yè)(job)交叉分組可以用table(sex,job)來統(tǒng)計每一交叉類的頻數(shù),結(jié)果為一個矩陣,矩陣帶有行名和列名,分別為兩個因子的各水平名。改變部分元素值的技術(shù)與邏輯值下標(biāo)方法結(jié)合可以定義向量的分段函數(shù)。例如:要定義y=f(x)為當(dāng)x<0時取1-x,否則取1+x,可以用:>x=c(-1,2,3,4,-3)>y=numeric(length(x))>y[x<0]=1-x[x<0]>y[x>=0]=1+x[x>=0]向量的分段函數(shù)要定義y=f(x)為當(dāng)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;y;思考題
下列()不能生成向量([1]54321)。5:1 B.6-1:5C.seq(1,5,by=-1) D.6-sequence(5)下列()不能生成向量([1]1234512345)。A.rep(1:5,2) B.sequence(rep(5,2))C.1:10%%6D.(0:9%%5)+1數(shù)組(array)是帶多個下標(biāo)的類型相同的元素的集合,常用的是數(shù)值型的數(shù)組如矩陣,也可以有其它類型(如字符型、邏輯型、復(fù)型數(shù)組)。數(shù)組有一個特征屬性叫做維數(shù)向量(dim屬性),比如維數(shù)向量有兩個元素時數(shù)組為二維數(shù)組(矩陣)。維數(shù)向量的每一個元素指定了該下標(biāo)的上界,下標(biāo)的下界總為1。數(shù)組(array)一組值只有定義了維數(shù)向量(dim屬性)后才能被看作是數(shù)組。比如:
>a=1:24>dim(a)=c(2,3,4)>a
數(shù)組元素的排列次序缺省情況下是采用FORTRAN的數(shù)組元素次序(按列次序),即第一下標(biāo)變化最快,最后下標(biāo)變化最慢,這里a的各元素次序為a[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)用函數(shù)array()可以更直觀地定義數(shù)組。array()函數(shù)的完全使用為array(x,dim=length(x),dimnames=NULL),其中x是第一自變量,應(yīng)該是一個向量,表示數(shù)組的元素值組成的向量。dim參數(shù)可省,省略時作為一維數(shù)組(但不同于向量)。dimnames屬性可以省略,不省略時是一個長度與維數(shù)相同的列表。a=array(c(1:24),dim=c(2,3,4),dimnames=NULL)數(shù)組下標(biāo)訪問數(shù)組的某個元素,寫出數(shù)組名和方括號內(nèi)用逗號分開的下標(biāo)即可,如a[2,1,2]。在每一個下標(biāo)位置寫一個下標(biāo)向量,表示對這一維取出所有指定下標(biāo)的元素,如a[1,2:3,2:3]取出所有第一下標(biāo)為1,第二下標(biāo)為2或3,第三下標(biāo)為2或3的元素。略寫某一維的下標(biāo),則表示該維全選。a[,,]或a[]都表示整個數(shù)組。a[]=0把元素都賦成0。
還有一種特殊下標(biāo)是對于數(shù)組只用一個下標(biāo)向量(是向量,不是數(shù)組),比如a[3:4],這時忽略數(shù)組的維數(shù)信息,把下標(biāo)表達(dá)式看作是對數(shù)組的數(shù)據(jù)向量取子集。函數(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ù)填入矩陣時按行次序還是列次序,缺省情況下按列次序。
dimnames缺省是空值,否則是一個長度為2的列表,列表第一個成員是長度與行數(shù)相等的字符型向量,表示每行的標(biāo)簽,列表第二個成員是長度與列數(shù)相同的字符型向量,表示每列的標(biāo)簽。例如,定義一個3行4列,由1:12按行次序排列的矩陣,可以用:>b<-matrix(1:12,ncol=4,byrow=T)矩陣(matrix)>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ù)個數(shù)允許少于所需的數(shù)據(jù)個數(shù),這時循環(huán)使用提供的數(shù)據(jù)。例如:>b<-matrix(0,nrow=3,ncol=4)生成3行4列的元素都為0的矩陣。矩陣是二維數(shù)組,應(yīng)用廣泛函數(shù)t(A)返回矩陣A的轉(zhuǎn)置。nrow(A)為矩陣A的行數(shù),ncol(A)為矩陣A的列數(shù)。矩陣之間進(jìn)行普通的加減乘除四則運算,即數(shù)組的對應(yīng)元素之間進(jìn)行運算,所以注意A*B不是矩陣乘法而是矩陣對應(yīng)元素相乘。要進(jì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另外,向量用在矩陣乘法中可以作為行向量看待也可以作為列向量看待,這要看哪一種觀點能夠進(jìn)行矩陣乘法運算。例如,設(shè)x是一個長度為n的向量,A是一個n*n矩陣,則“x%*%A%*%x”表示二次型。但是,有時向量在矩陣乘法中的地位并不清楚,比如“x%*%x”就既可能表示內(nèi)積,也可能表示n*n陣。因為前者較常用,所以R選擇表示前者,但內(nèi)積最好還是用crossprod(x)來計算。要表示n*n陣,可以用“cbind(x)%*%x”或“x%*%rbind(x)”。函數(shù)crossprod(X,Y)表示一般的交叉乘積(內(nèi)積),即X的每一列與Y的每一列的內(nèi)積組成的矩陣。如果X和Y都是向量則是一般的內(nèi)積。只寫一個參數(shù)X的crossprod(X)計算X自身的內(nèi)積。其它矩陣運算還有solve(A,b)解線性方程組,solve(A)求方陣A的逆矩陣,svd()計算奇異值分解,qr()計算QR分解,eigen()計算特征向量和特征值。詳見隨機幫助,例如:>?qr函數(shù)diag()的作用依賴于其自變量。diag(vector)返回以自變量(向量)為主對角元素的對角矩陣。diag(matrix)返回由矩陣的主對角元素組成的向量。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ù)據(jù)框(data.frame)數(shù)據(jù)框是R中類似SAS數(shù)據(jù)集的一種數(shù)據(jù)結(jié)構(gòu)。它通常是矩陣形式的數(shù)據(jù),但矩陣各列可以是不同類型的。數(shù)據(jù)框每列是一個變量,每行是一個樣品的觀測值。數(shù)據(jù)框有更一般的定義。它是一種特殊的列表對象,有一個值為“data.frame”的class屬性,各列表成員必須是向量(數(shù)值型、字符型、邏輯型)、因子、數(shù)值型矩陣、列表,或其它數(shù)據(jù)框。向量、因子成員為數(shù)據(jù)框提供一個變量,如果向量非數(shù)值型則會被強制轉(zhuǎn)換為因子,而矩陣、列表、數(shù)據(jù)框這樣的成員為新數(shù)據(jù)框提供了和其列數(shù)、成員數(shù)、變量數(shù)相同個數(shù)的變量。作為數(shù)據(jù)框變量的向量、因子或矩陣必須具有相同的長度(行數(shù))。盡管如此,我們一般還是可以把數(shù)據(jù)框看作是一種推廣了的矩陣,它可以用矩陣形式顯示,可以用對矩陣的下標(biāo)引用方法來引用其元素或子集。數(shù)據(jù)框數(shù)據(jù)框可以用data.frame()函數(shù)生成,其用法與list()函數(shù)相同,各自變量變成數(shù)據(jù)框的成分,自變量可以命名,成為變量名。例如:>d=data.frame(name=c("趙","錢","孫","李","王"),age=c(20,21,22,21,20),height=c(170,171,175,165,181),gender=c("男","女","男","女","男"))>d
如果一個列表的各個成分滿足數(shù)據(jù)框成分的要求,它可以用as.data.frame()函數(shù)強制轉(zhuǎn)換為數(shù)據(jù)框。比如,上面的d如果先用list()函數(shù)定義成了一個列表,就可以強制成為一個數(shù)據(jù)框。一個矩陣可以用data.frame()轉(zhuǎn)換為一個數(shù)據(jù)框,如果它原來有列名則其列名被作為數(shù)據(jù)框的變量名,否則系統(tǒng)自動為矩陣的各列起一個變量名(如X1,X2)。>dnameageheightgender1趙20170男
2錢21171女
3孫22175男
4李21165女
5王20181男>d[1]name1趙
2錢
3孫
4李
5王>d[[1]][1]"趙""錢""孫""李""王“>d[[2]][2:3][1]2122數(shù)據(jù)框引用引用數(shù)據(jù)框元素的方法與引用矩陣元素的方法相同,可以使用下標(biāo)或下標(biāo)向量,也可以使用名字或名字向量。如d[1:2,2:3]。數(shù)據(jù)框的各變量也可以按列表引用(即用雙括號[[]]或$符號引用)。數(shù)據(jù)框的變量名由屬性names定義,此屬性一定是非空的。數(shù)據(jù)框的各行也可以定義名字,可以用rownames屬性定義。如:>names(d)[1]"name""age""height""gender">rownames(d)[1]"1""2""3""4""5"R語言的數(shù)據(jù)結(jié)構(gòu)矩陣:數(shù)據(jù)框:二維數(shù)據(jù)對象相同點不同點數(shù)據(jù)框二維行與列的意義不同:列表示變量;行表示觀測值。矩陣、二維數(shù)組行列意義相同思考題
下列說法錯誤的是()。A.?dāng)?shù)據(jù)框和矩陣都是二維的。B.?dāng)?shù)據(jù)框的行與列意義不同,而矩陣的行與列只代表數(shù)據(jù)的位置。C.顯示數(shù)據(jù)框時左側(cè)會顯示觀測值的序號,顯示矩陣時只顯示矩陣中的數(shù)據(jù)。D.可以用data.frame函數(shù)建立數(shù)據(jù)框,用matrix()函數(shù)建立矩陣。列表(list)定義列表(List)是R中最復(fù)雜的數(shù)據(jù)類型,一般來說,列表是數(shù)據(jù)對象的有序集合,但是,列表的各個元素(item)的數(shù)據(jù)類型可以不同,每個元素的長度可以不同,是R中最靈活的數(shù)據(jù)類型。列表項可以是列表類型,因此,列表被認(rèn)為是遞歸變量,與之相對,向量,數(shù)組,矩陣,數(shù)據(jù)框被認(rèn)為是原子變量。列表元素用“列表名[[下標(biāo)]]”的格式引用。但是,列表不同于向量,我們每次只能引用一個元素,如rec[[1:2]]的用法是不允許的。注意:“列表名[下標(biāo)]”或“列表名[下標(biāo)范圍]”的用法也是合法的,但其意義與用兩重括號的記法完全不同,兩重記號取出列表的一個元素,結(jié)果與該元素類型相同,如果使用一重括號,則結(jié)果是列表的一個子列表(結(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]])在定義列表時如果指定了元素的名字(如rec中的name,age,scores),則引用列表元素還可以用它的名字作為下標(biāo),格式為“列表名[["元素名"]]”,如:
>rec[["age"]][1]30另一種格式是“列表名$元素名”,如:
>rec$age[1]30
其中“元素名”可以簡寫到與其它元素名能夠區(qū)分的最短程度,比如“rec$s”可以代表“rec$score”。這種寫法方便了交互運行,編寫程序時一般不用簡寫,以免降低程序的可讀性。使用元素名的引用方法可以讓我們不必記住某一個下標(biāo)代表那一個元素,而直接用易記的元素名來引用元素。事實上,已知向量和矩陣都可以指定元素名、行名、列名。定義列表使用list()函數(shù),每一個自變量變成列表的一個元素,自變量可以用“名字=值”的方式給出,即給出列表元素名。自變量的值被復(fù)制到列表元素中,自變量如果是變量并不會與該列表元素建立關(guān)系(改變該列表元素不會改變自變量的值)。(例見后)修改列表列表的元素可以修改,只要把元素引用賦值即可。如:>rec$age<-45
甚至>rec$age<-list(19,29,31)(可以任意修改一個列表元素)。如果被賦值的元素原來不存在,則列表延伸以包含該新元素。例如,rec現(xiàn)在共有三個元素,我們定義一個新的命名元素,則列表長度變?yōu)?,再定義第六號元素則列表長度變?yōu)?(第5個元素自動為NULL):
>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第五號元素因為沒有定義所有其值是“NULL”,這是空對象的記號。如果rec是一個向量,則其空元素為“NA”,這是缺失值的記號。從這里我們也可以體會“NULL”與“NA”的區(qū)別。幾個列表可以用連接函數(shù)c()連接起來,結(jié)果仍為一個列表,其元素為各自變量的列表元素。如:>list.ABC<-c(list.A,list.B,list.C)(注意在R中句點是名字的合法部分,一般沒有特殊意義。)R語言的數(shù)據(jù)結(jié)構(gòu)思考題:
1、在命令行鍵入q()的含義是
。
A、保存R程序
B、加載工作空間C、退出R軟件
D、新建工作空間2、table(x)命令的含義是()
。
A、顯示屬性向量x的取值及頻數(shù)
B、顯示屬性向量x的取值
C、顯示向量x的頻數(shù)
D、顯示向量x取值的頻率2.6R語言流程控制程序控制結(jié)構(gòu)是應(yīng)用if條件語句、循環(huán)語句等控制程序的走向。程序控制結(jié)構(gòu)又稱為流程控制。條件語句包括if,switch語句,可用復(fù)合表達(dá)式而且可用ifelse,switch語句根據(jù)條件表達(dá)式的值,選擇執(zhí)行的語句組。循環(huán)語句有for、while、repeat語句,并且可用組合break和next語句的方法。常見控制結(jié)構(gòu)的命令if
and
else:測試邏輯條件switch:分支的選擇for:
用于執(zhí)行固定次數(shù)的循環(huán)while:用于在某個條件成立時執(zhí)行循環(huán)repeat:執(zhí)行無限循環(huán)break:終止并跳出循環(huán)next:
跳過循環(huán)中的當(dāng)前迭代return:
從函數(shù)中退出分支選擇循環(huán)控制if-else語句如果條件成立,程序就做某件事否則(另一種條件下)。程序做另一件事if(<condition>){ ##dosomething}else{## dosomethingelse
}在}和else之間不能有新的行條件語句if-else語句else不是必須的,如果只需要在某條件成立時執(zhí)行某個任務(wù),那么只要使用if語句就可以了if(<condition>){##dosomething}##Continuewithrestofcode條件語句if-else語句如果條件不止一個/不止兩個的時候,可以添加一個/多個
elseif語句,但最后必須以else結(jié)尾:if(<condition1>){##dosomething
}elseif(<condition2>){##dosomethingdifferent
}else{##dosomethingdifferent
}在}和elseif或else之間不能有新的行條件語句ifelse函數(shù)ifelse(test,yes,no)test為真,輸出yes值,否則輸出no值。判斷條件為向量x<-c(1,1,1,0,0,1,1)ifelse(x!=1,1,0)#若x的值不等于1,輸出1,否則輸出0[1]0001100判斷條件為單個值x<-15ifelse(x>10,print("x真大。"),print("x真小。"))[1]
"x真大。"條件函數(shù)switch函數(shù)switch函數(shù)的第一個參數(shù)是表達(dá)式(exp),通常是一個字符串;當(dāng)表達(dá)式(exp)匹配后續(xù)的參數(shù)名(即變量名)時,返回參數(shù)的值:>color<-function(t)switch(t,r='red',g='green',b='blue')>color('r')[1]"red“注意如果不匹配任何參數(shù)名,switch函數(shù)不返回任何值,可以添加一個匿名的參數(shù),當(dāng)表達(dá)式(exp)匹配不上任意一個命名參數(shù)時,switch函數(shù)將返回匿名參數(shù)的值:>color<-function(t)switch(t,r='red',g='green',b='blue','error')>color('d')[1]"error"條件語句repeat循環(huán)語句
repeat循環(huán):先執(zhí)行代碼,遇到break關(guān)鍵字,結(jié)束循環(huán),也可以在break關(guān)鍵字前增減if(test)語句,當(dāng)指定的條件成立(為TRUE)時,執(zhí)行break關(guān)鍵字,結(jié)束循環(huán):repeat{
code
if(test)
break
}
循環(huán)語句repeat循環(huán)例子我們想計算兩個值何時達(dá)到無限接近,需要通過算法不斷循環(huán),直到逼近設(shè)置的容差(允許范圍)x0<-1
tol<-1e-8
repeat{x1<-computeEstimate() if(abs(x1-x0)<tol){ ##Closeenough? break }else{x0<-x1 }}循環(huán)語句循環(huán)語句while循環(huán)語句
while循環(huán):先檢測條件,如果條件為TRUE,執(zhí)行code;如果條件為FALSE,結(jié)束循環(huán):while(test){code}循環(huán)語句while循環(huán)例子設(shè)定一個計數(shù)變量count,初始值為0,當(dāng)計數(shù)變量的值小于10(邏輯表達(dá)式)時,運行輸出變量count,并在之前的基礎(chǔ)上+1,一旦count的值達(dá)到10,循環(huán)停止count<-0
while(count<10){print(count)count<-count+1
}循環(huán)語句for循環(huán)語句for循環(huán)是R中最常見的循環(huán)運算符,基本思路是先要設(shè)定一個循環(huán)下標(biāo),通常命名為i,循環(huán)下標(biāo)通常會代表一個整數(shù)數(shù)列中的每一個數(shù)字,或列表中的每一個對象等等。for(iinc(1:5)){code}循環(huán)語句for循環(huán)例子1最簡單的例子如下,運行后將依次輸出1-10這十個整數(shù):for(iin
1:10){ print(i)}[1]1[1]2[1]3[1]4[1]5[1]6[1]7[1]8[1]9[1]10循環(huán)語句for循環(huán)例子2依次打印向量x中的每一個元素,運行后就會依次輸出"a",
"b",
"c",
"d"四個字符對象方法1:是將循環(huán)向量和向量x的長度相對應(yīng):x<-c("a","b","c","d")for(iin
1:4){print(x[i])}方法2:使用seq_along()函數(shù),即輸入一個向量,之后它就會創(chuàng)造一個與該向量等長的整數(shù)數(shù)列。for(iinseq_along(x)){print(x[i])}循環(huán)語句for循環(huán)例子2依次打印向量x中的每一個元素,運行后就會依次輸出"a",
"b",
"c",
"d"四個字符對象方法3:使用下標(biāo)變量,這個變量的本意就是一個下標(biāo),會從向量本身取值,它可以從任意向量中提取元素,因此可以寫成:x<-c("a","b","c","d")for(lettersinx){print(letters)}如果for循環(huán)表達(dá)式只有一行,那么可以省略掉大括號{},直接寫道for的后面:for(lettersinx)print(letters)循環(huán)語句for循環(huán)例子3嵌套for循環(huán)(Nestedforloop):把一個for循環(huán)放到另一個for循環(huán)的里面。嵌套for結(jié)構(gòu)打印出矩陣中所有元素。:x<-matrix(1:6,2,3)for(iinseq_len(nrow(x))){ for(jinseq_len(ncol(x))){ print(x[i,j]) }}循環(huán)語句break函數(shù)break用來完全退出循環(huán)。for(iin
1:100){ print(i) if(i>20){ ##Stoploopafter20iterations
break
} }循環(huán)語句next和return函數(shù)next可用在任何一種循環(huán)中,跳過某一段循環(huán)。例如,在1-100的迭代循環(huán)中,想要跳過前20個,可以用這種方式:return主要用于退出函數(shù),它會結(jié)束整個函數(shù)并且返回一個數(shù)值。for(iin
1:100){
if(i<=20){ ##Skipthefirst20iterations
next
} ##Dosomethinghere }2.7自定義函數(shù)R可以靈活的編寫程序,用戶自己編寫的程序可以直接調(diào)用。R語言編程時無需聲明變量的類型,這與C,C++等語言不同。每一個R函數(shù)都包括三個部分:函數(shù)名,程序主體以及參數(shù)集合,在編寫自定義R函數(shù)時,需要將三個部分各自儲存在一個R對象中。函數(shù)定義的基本格式如下,
Fun-name<-function(arg_1,arg_2,...){expression}expression是R中的表達(dá)式(通常是一組表達(dá)式),arg_1,arg_2,…表示函數(shù)的參數(shù),表達(dá)式中,放在程序最后的信息是函數(shù)的返回值,返回值可以是向量、數(shù)組(矩陣)、列表或數(shù)據(jù)框。調(diào)用函數(shù)的格式為Fun-name(expr_1,expr_2,…),并且在任何時調(diào)用都是合法的。在調(diào)用自己編寫的函數(shù)(程序)時,需要將已寫好的函數(shù)調(diào)到內(nèi)存中,如執(zhí)行source()函數(shù)。例1:調(diào)用沒有參數(shù)的
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 文書模板-精誠共治協(xié)議書
- 《金融物流概括》課件
- 2024年時尚潮流:《杠桿》視角解讀
- 2024年電影工業(yè)新探:《聽聽聲音》課件在電影制作中的創(chuàng)新應(yīng)用
- 班主任2024培訓(xùn)心得體會:新理念下的教育實踐
- 2024年安全心理學(xué)課件制作與個性化學(xué)習(xí)需求
- 視頻號推廣方案
- 2024年教育改革下的《馬鈞傳》教學(xué)策略
- 第六章-1八綱辨證
- 2012年燃?xì)饨?jīng)營許可證換證申請表
- 安全生產(chǎn)專(兼)職管理人員職責(zé)
- 湖南省長沙市長沙市長郡集團(tuán)聯(lián)考2024-2025學(xué)年九年級上學(xué)期11月期中語文試題(含答案)
- 家具制造業(yè)售后服務(wù)預(yù)案
- 電子產(chǎn)品維修合同范本1
- 《籃球原地雙手胸前傳接球》教案 (三篇)
- 第7章-機器學(xué)習(xí)
- 2024年T電梯修理考試100題及答案
- 第1課 課題一《課外生活小調(diào)查·周末生活我采訪》(教案)-2024-2025學(xué)年三年級上冊綜合實踐活動浙教版
- 2024年秋季1530安全教育記錄
- 邀請函單頁模板
- 一般跨越架搭設(shè)施工方案
評論
0/150
提交評論