在《R語言的數(shù)據(jù)對(duì)象》一文中提到,R語言的數(shù)據(jù)對(duì)象從結(jié)構(gòu)角度劃分,可以分為向量、數(shù)組、矩陣、因子、列表和數(shù)據(jù)框6種。本文首先探討一下R語言中向量的使用方法。
在R語言中,向量(Vector)是相同基本類型元素組成的序列,相當(dāng)于一維數(shù)組。
向量的元素可以是數(shù)值型、字符型、邏輯值型和復(fù)數(shù)型,對(duì)應(yīng)分別稱為數(shù)值型向量、字符串型向量、邏輯型向量和復(fù)數(shù)型向量。
向量中可以包含一個(gè)元素,也可以包含多個(gè)元素。
同一個(gè)向量中的數(shù)據(jù)類型應(yīng)該相同。
1、向量的創(chuàng)建
(1)直接創(chuàng)建
x1<-1:10 #輸出:[1] 1 2 3 4 5 6 7 8 9 10
x2<-4.3 #只包含一個(gè)值的向量
x3<-TRUE #邏輯型向量,注意在R中,TRUE和FALSE必須大寫
x4 <- "I Love China" #字符串型向量
在R語言中,<-表示賦值,即右側(cè)的值賦給左側(cè)的變量。在R語言中,->的寫法也是正確的,即把左側(cè)的賦給右側(cè)的變量。但等號(hào)=不是R語言的標(biāo)準(zhǔn)語法,在有些情況下可能會(huì)出現(xiàn)問題,不建議使用。
在R語言中#是注釋符,即#后面的內(nèi)容是注釋的內(nèi)容,是對(duì)該行內(nèi)容的一個(gè)解釋。
本部分在Windows R3.4.1中的執(zhí)行情況見下圖:
(2)使用c()函數(shù)創(chuàng)建
使用c()函數(shù)可以創(chuàng)建多個(gè)值的向量
v1 <- c(1,3,4,9,10) #輸出1 3 4 9 10
v1 <- c(1:10) #創(chuàng)建1到10的向量 輸出:1 2 3 4 5 6 7 8 9 10
v2<- c("Male","Female", "Female", "Male") #字符串型向量
v3<- c(TRUE,FALSE,FALSE,TRUE) #邏輯型向量
v4 <- c() #一個(gè)不包含任何值的向量 輸出NULL
在R語言中,c()函數(shù)可以有任意多個(gè)參數(shù)。
本部分的執(zhí)行情況見下圖:
(3)使用seq函數(shù)生成等差序列的向量
seq函數(shù)的原型如下:
seq(from=1,to=1,by=((to-from)/(length.out - 1)),length.out = NULL,along.with = NULL,...)
其中,from是首項(xiàng),默認(rèn)為1;to是末項(xiàng),默認(rèn)為1;by是步長或等差增量,可以為負(fù)數(shù);length.out是向量的長度;along.with:用于指明該向量與另外一個(gè)向量的長度相同,along.with后應(yīng)為另外一個(gè)向量的名字。
s1 <- seq(1,10,2) #向量從1開始,步長為2,最大不超過10,這里輸出:1 3 5 7 9
s2 <- seq(1,9,length.out = 5) # 輸出1 3 5 7 9,這里的步長是根據(jù)(9 - 1)/(5-1)計(jì)算出來的
s3 <- seq(3,by=3,length.out=5) #輸出3 6 9 12 15
s4 <- seq(by=3,along.with = s3) #輸出1 4 7 10 13,未指定from項(xiàng)時(shí),默認(rèn)從1開始,長度與向量s3相同
s5 <- seq(length.out = 3) #輸出1 2 3
s6 <- seq(along.with = s5) #輸出 1 2 3
s7 <- seq(9,by=-2,length.out=6) # 9 7 5 3 1 -1
進(jìn)一步說明:這里的from, to,by項(xiàng)可以為任意實(shí)數(shù),即也可以為浮點(diǎn)數(shù)。
本部分的執(zhí)行情況見下圖:
(4)使用rep函數(shù)創(chuàng)建重復(fù)序列的向量
rep函數(shù)可以將某一向量重復(fù)若干次,該函數(shù)的原型如下:
rep(x , times = 1, length.out = NA, each = 1)
參數(shù)中,x為要重復(fù)的序列對(duì)象;times為重復(fù)的次數(shù),默認(rèn)為1;length.out為產(chǎn)生的向量長度,默認(rèn)為NA(未限制);each為每個(gè)元素重復(fù)的次數(shù),默認(rèn)為1。
r1 <- rep(1:3,2) #輸出: 1 2 3 1 2 3 前面的序列按原順序重復(fù)2次
r2 <- rep(1:3, each =2) # 輸出 1 1 2 2 3 3 序列中的每個(gè)元素重復(fù)2次
r3 <- rep(c(2,5),c(3,4)) #輸出2 2 2 5 5 5 5 5將向量c(2, 5)按照后面給出的次數(shù)向量依次重復(fù)3次和4次
r4 <- rep(c(2,4,6),each=2 ,length.out = 5) #輸出2 2 4 4 6 由于規(guī)定長度為5,這里僅有5項(xiàng)
r5 <- rep(c(2,4,6),each=2,times=3) #輸出2 2 4 4 6 6 2 2 4 4 6 6 2 2 4 4 6 6 每項(xiàng)2次,整體3次
r6 <- rep(c(2,4,6),times=3,length.out=5) #輸出2 4 6 2 4 整體應(yīng)該重復(fù)3次,但這里規(guī)定了長度,所以只有5項(xiàng)
本部分的執(zhí)行情況見下圖:
2、為向量的每個(gè)元素命名
vn <- c(11,22,33,44)
names(vn) <- c("one","two","three","four") #對(duì)應(yīng)元素的名字分別為one, two, three, four
本部分的執(zhí)行情況見下圖:
3、向量的引用
vc <- c(11,22,33,44,55,66) #創(chuàng)建一個(gè)向量
(1)使用元素的位置引用
① vc[1] #提取第一個(gè)元素值:11
② vc[1:3] #提取1~3個(gè)元素的值:11 22 33
③ vc[c(2,4,5)] #提取第2、第4和第5個(gè)元素的值:22 44 55
④ vc[-1] #提取除第一個(gè)元素之外的元素值:22 33 44 55 66
⑤ vc[-(1:3)] #提取除1~3個(gè)元素之外的元素值:44 55 66
⑥ vc[-c(2,4,5)] #提取除第2、第4和第5個(gè)之外的元素值:11 33 66
(2)使用邏輯向量
⑦ vc[c(TRUE,TRUE,FALSE,FALSE,TRUE,FALSE)] #提取對(duì)應(yīng)位置為TRUE的元素值:11 22 55
⑧ vc[c(TRUE,FALSE)] #輸出11 33 55 這里的c(TRUE,FALSE)自動(dòng)補(bǔ)齊到與vc向量長度相同,c(TRUE,FALSE,TRUE,FALSE,TRUE,FALSE)
⑨ vc[c(TRUE,TRUE,FALSE)] #輸出11 22 44 55
(3)使用元素名字
names(vc) <- c("one","two","three","four","five","six") #為每個(gè)元素命名為one,two,three,four,five,six
⑩ vc["one"] #輸出11(在此值上方會(huì)有其名字one) 這種方法只能用于訪問一個(gè)元素的情況
?vc[c("one","three","six")] #輸出11 33 66 (其上方會(huì)帶有其對(duì)應(yīng)的名字)
(4)使用which函數(shù)進(jìn)行篩選
?which(vc==11) # 找出向量vc中元素值為11的元素位置:這里輸出1,即11在vc中的位置為1
?which(vc==11|vc==33)) #找出向量vc中元素值為11或33的元素所在位置:1 3
?which(vc>11 & vc<=44)#找出元素值大于11且小于44的元素所在位置:2 3 4
?which.max(vc) #最大元素值所在的位置:6
?which.min(vc) #最小元素所在的位置:1
(5)使用subset函數(shù)索引
可以使用subset函數(shù)找出向量中滿足給定條件的向量元素值,語法格式如下:
subset(向量名,邏輯條件)
?subset(vc,vc>11 & vc<55) #得到 22 33 44
?subset(vc,c(TRUE,FALSE,TRUE)) #11 33 44 66 邏輯向量通過重復(fù)自動(dòng)補(bǔ)齊
(6)match函數(shù)
該函數(shù)的原型為:
match(x,y)
該函數(shù)返回的是x中的每個(gè)元素在y中對(duì)應(yīng)的位置,如果x中的元素在y中不存在,則該位置返回NA
?match(vc,c(11,22)) # 1 2 NA NA NA NA 因?yàn)閤中的33 44 55 66在c(11,22)中不存在,所以后面4個(gè)為NA
?match(vc,c(11,33,55,66,88,99)) # 1 NA 2 NA 3 4 vc中的22在給定的序列中不存在所以第2個(gè)為NA,33在給定的序列位置為2,所以vc中的第3個(gè)元素位置為2...
4、向量的編輯
(1)擴(kuò)展向量
vc<-c(11,22,33,44) #創(chuàng)建一個(gè)向量
vc <-c(vc,c(55,66)) #給vc擴(kuò)展,增加了2個(gè)元素55和66
vc <- append(vc,77) #在向量最后追加一個(gè)新元素77
vc <- append(vc,c(88,99)) #在向量后追加連個(gè)元素88和99
vc<- append(vc,100,3) #在第3個(gè)元素后追加一個(gè)新元素100 :11 22 33 100 44 55 66 77 88 99
說明,使用append追加元素會(huì)生成一個(gè)新的向量,不是直接在原向量中追加,看下面的例子:
vc<- c(11,22,33)
append(vc,c(44,55))
若重新輸出vc,會(huì)發(fā)現(xiàn)vc的向量值元素仍然為:11 22 33,并沒有發(fā)生變化
只有這樣vc <- append(vc,c(44,55)),重新打印vc的值為:11 22 33 44 55
(2)改變?cè)氐闹?/p>
vc[1] <- 111 #向量vc的第一個(gè)元素值變?yōu)?11
vc[1:3] <- 111 #向量vc中第1~第3個(gè)元素的值都變?yōu)?11
vc[1:3] <- c(111,222,333) #向量vc中第1~第3個(gè)元素的值分別被修改為111 222 333
vc[vc>33] <- 11 #將向量vc中的所有元素值大于33的元素值修改為11
vc[vc==33] <- 11 #將向量vc中元素值為33的元素值修改為11
(3)刪除元素
vc<-vc[-1] #從vc中刪除了位置為1的元素
vc<-vc[-c(3:5)] #從vc中刪除了位置為3,4,5的元素
vc<-vc[c(2:4)] #刪除了出位置為2,3,4之外的元素
5、向量的排序
(1)sort函數(shù)
sort函數(shù)原型如下:
sort(x, decreasing=FALSE,na.last = NA,index.return = FALSE,...)
x為要排序的對(duì)象,decreasing為排序順序,是否為降序,默認(rèn)為FALSE,即升序;na.last是對(duì)NA(mising value 或者Not available)值的處理,若為TRUE,則NA值將放在最后,若為FALSE,NA值將放在最前面,若為NA,則排序時(shí)剔除掉NA值;index.return是個(gè)邏輯值,設(shè)置是否顯示排序序列對(duì)應(yīng)的元素值在未排序前序列中的對(duì)應(yīng)位置索引,默認(rèn)為FALSE。
sort可以使用的的形式如下:
sort(vc) #默認(rèn)升序排序,NA值不參與排序,且被剔除掉,即若vc中有NA值的話,排序后的序列中不含有NA值
sort(vc,decreasing = TRUE) #降序排序,NA值默認(rèn)被剔除掉
sort(vc,na.last = TRUE) #默認(rèn)升序排序,NA值不被剔除掉,且放在排序序列的后面
注意:排序生成新的序列,不會(huì)影響原向量的值及順序
(2)rev函數(shù)
rev函數(shù)將向量倒序,即將原向量的元素按位置翻轉(zhuǎn)
vc <- c(11,44,33,22,77,66) #創(chuàng)建一個(gè)向量
rev(vc) #66 77 22 33 44 11
6、用于向量的一些函數(shù)
(1)求和函數(shù)sum()
v <- c(1:10) #創(chuàng)建一個(gè)新向量:1 2 3 4 5 6 7 8 9 10
sum(vc) # 55
(2)求最大值函數(shù)max()
max(v) # 10
(3)求最小值函數(shù)min()
min(v) # 1
(4)求均值函數(shù)mean()
mean(v) # 5.5
(5)求中位數(shù)函數(shù)median()
median(v) # 5.5
v1<- c(1:9) # 創(chuàng)建一個(gè)新向量:1 2 3 4 5 6 7 8 9
median(v1) # 5
(6)range()函數(shù)
相當(dāng)于c(min(x), max(x))
range(v) # 1 10
range(v1) #1 9
(7)求方差函數(shù)var()
var(v) #9.166667
var(v1) # 7.5
(8)求標(biāo)準(zhǔn)差函數(shù) sd()
sd(v) #3.02765
sd(v1) #2.738613
(9)求向量元素值連乘積prod()
prod(v) #3628800
prod(v1) #362880
(10)累加和向量函數(shù)cumsum(x)
結(jié)果是一個(gè)向量,長度與x相同,每一項(xiàng)的值是該項(xiàng)與前一項(xiàng)累加后的值
cumsum(v1) #1 3 6 10 15 21 28 36 45
cumsum(v) #1 3 6 10 15 21 28 36 45 55
(完)
新聞熱點(diǎn)
疑難解答