当前位置:K88软件开发文章中心编程全书编程全书02 → 文章内容

R语言中向量的使用

减小字体 增大字体 作者:佚名  来源:翔宇亭IT乐园  发布时间:2019-1-3 3:02:19

:2017-10-05 10:27:28

在《R语言的数据对象》一文中提到,R语言的数据对象从结构角度划分,可以分为向量、数组、矩阵、因子、列表和数据框6种。本文首先探讨一下R语言中向量的使用方法。

在R语言中,向量(Vector)是相同基本类型元素组成的序列,相当于一维数组。

向量的元素可以是数值型、字符型、逻辑值型和复数型,对应分别称为数值型向量、字符串型向量、逻辑型向量和复数型向量。

向量中可以包含一个元素,也可以包含多个元素。

同一个向量中的数据类型应该相同。

1、向量的创建

(1)直接创建

x1<-1:10  #输出:[1] 1 2 3 4 5 6 7 8 9 10

x2<-4.3  #只包含一个值的向量

x3<-TRUE #逻辑型向量,注意在R中,TRUE和FALSE必须大写

x4 <- "I Love China"   #字符串型向量

在R语言中,<-表示赋值,即右侧的值赋给左侧的变量。在R语言中,->的写法也是正确的,即把左侧的赋给右侧的变量。但等号=不是R语言的标准语法,在有些情况下可能会出现问题,不建议使用。

在R语言中#是注释符,即#后面的内容是注释的内容,是对该行内容的一个解释。

本部分在Windows R3.4.1中的执行情况见下图:

(2)使用c()函数创建

使用c()函数可以创建多个值的向量

v1 <- c(1,3,4,9,10)   #输出1 3 4 9 10

v1 <- c(1:10)   #创建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() #一个不包含任何值的向量 输出NULL

在R语言中,c()函数可以有任意多个参数。

本部分的执行情况见下图:

(3)使用seq函数生成等差序列的向量

seq函数的原型如下:

seq(from=1,to=1,by=((to-from)/(length.out - 1)),length.out = NULL,along.with = NULL,...)

其中,from是首项,默认为1;to是末项,默认为1;by是步长或等差增量,可以为负数;length.out是向量的长度;along.with:用于指明该向量与另外一个向量的长度相同,along.with后应为另外一个向量的名字。

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,这里的步长是根据(9 - 1)/(5-1)计算出来的

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项时,默认从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

进一步说明:这里的from, to,by项可以为任意实数,即也可以为浮点数。

本部分的执行情况见下图:

(4)使用rep函数创建重复序列的向量

rep函数可以将某一向量重复若干次,该函数的原型如下:

rep(x , times = 1, length.out = NA,  each = 1)

参数中,x为要重复的序列对象;times为重复的次数,默认为1;length.out为产生的向量长度,默认为NA(未限制);each为每个元素重复的次数,默认为1。

r1 <- rep(1:3,2)  #输出: 1 2 3 1 2 3   前面的序列按原顺序重复2次

r2 <- rep(1:3, each =2)  # 输出 1 1 2 2 3 3 序列中的每个元素重复2次

r3 <- rep(c(2,5),c(3,4)) #输出2 2 2 5 5 5 5 5将向量c(2, 5)按照后面给出的次数向量依次重复3次和4次

r4 <- rep(c(2,4,6),each=2 ,length.out = 5) #输出2 2 4 4 6  由于规定长度为5,这里仅有5项

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 每项2次,整体3次

r6 <- rep(c(2,4,6),times=3,length.out=5) #输出2 4 6 2 4 整体应该重复3次,但这里规定了长度,所以只有5项

本部分的执行情况见下图:

2、为向量的每个元素命名

vn <- c(11,22,33,44)

names(vn) <- c("one","two","three","four")  #对应元素的名字分别为one, two, three, four

本部分的执行情况见下图:

3、向量的引用

vc <- c(11,22,33,44,55,66)   #创建一个向量

(1)使用元素的位置引用

① vc[1]  #提取第一个元素值:11

② vc[1:3] #提取1~3个元素的值:11 22 33

③ vc[c(2,4,5)]  #提取第2、第4和第5个元素的值:22 44 55

④ vc[-1] #提取除第一个元素之外的元素值:22 33 44 55 66

⑤ vc[-(1:3)] #提取除1~3个元素之外的元素值:44 55 66

⑥ vc[-c(2,4,5)] #提取除第2、第4和第5个之外的元素值:11 33 66

(2)使用逻辑向量

⑦ vc[c(TRUE,TRUE,FALSE,FALSE,TRUE,FALSE)] #提取对应位置为TRUE的元素值:11 22 55

⑧ vc[c(TRUE,FALSE)] #输出11 33 55 这里的c(TRUE,FALSE)自动补齐到与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")  #为每个元素命名为one,two,three,four,five,six

⑩ vc["one"] #输出11(在此值上方会有其名字one)  这种方法只能用于访问一个元素的情况

⑪vc[c("one","three","six")] #输出11 33 66 (其上方会带有其对应的名字)

(4)使用which函数进行筛选

⑫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函数索引

可以使用subset函数找出向量中满足给定条件的向量元素值,语法格式如下:

subset(向量名,逻辑条件)

⑰subset(vc,vc>11 & vc<55)  #得到 22 33 44

⑱subset(vc,c(TRUE,FALSE,TRUE))  #11 33 44 66  逻辑向量通过重复自动补齐

(6)match函数

该函数的原型为:

match(x,y)  

该函数返回的是x中的每个元素在y中对应的位置,如果x中的元素在y中不存在,则该位置返回NA

⑲match(vc,c(11,22))  # 1 2 NA NA NA NA  因为x中的33 44 55 66在c(11,22)中不存在,所以后面4个为NA

⑳match(vc,c(11,33,55,66,88,99)) # 1 NA 2 NA 3 4  vc中的22在给定的序列中不存在所以第2个为NA,33在给定的序列位置为2,所以vc中的第3个元素位置为2...

4、向量的编辑

(1)扩展向量

vc<-c(11,22,33,44)  #创建一个向量

vc <-c(vc,c(55,66))  #给vc扩展,增加了2个元素55和66

vc <- append(vc,77)  #在向量最后

[1] [2]  下一页


R语言中向量的使用