- 建立向量
一、我们可以直接建立一个向量
a <- 5
b <- TRUE
c <- "北京"
在R语言中,TRUE
和FASLE
要全部大写。
二、用c()函数创建多个向量
a <- c(1,2,5,3,6,-2,4)
b <- c("one","two","three")
c <- c(TRUE,TRUE,TRUE,FALSE,TRUE,FALSE)
d <- c(1:10) #输出1到10,括号可以省略
x <- c()
最后一个建立了一个空向量,这样的好处是便于今后好加入新的值。
三、使用seq()函数生成等差序列的向量
sep函数的原型如下:
seq(from = 1,to = 1,by = ((to - from)/(length.out - 1)),length.out = NULL,along.with = NULL,...)
seq_along(along.with)
seq_len(length.out)
其中from
是首项,默认为1;to
是末项,默认为1;by
是步长或等差增量,可以为负数,当没有指定to
末项的时候,默认为1;length.out
是向量的长度(length.out
通常缩写为length
或len
);along.with
用于指明该向量与另外一个向量的长度相同,along.with
后应为另外一个向量的名字。
例子:
seq(from = 1, to = 10) #从1输出到10
seq(1,10,2) #从1开始,步长为2,最大不超过10。
seq(1,9,length = 5) #从1开始,最大不超过9,输出5个,系统可以自动计算步长
s3 <- seq(3,by = 3,length = 5) #输出3 6 9 11 14
s4 <- seq(by = 3,along.with = s3) #长度与s3一致,输出1 4 7 10 13
#在没指定其他参数的情况下,使用seq_along更为方便
s4 <- seq_along(s3)
seq(length.out = 4) #输出1 2 3 4
#在没指定其他参数的情况下,使用seq_len更为方便
seq_len(4)
四、使用rep()函数创建重复序列的向量
rep函数的原型如下:
rep(x,times = 1,length.out = NA,each = 1)
其中x
为要重复的序列对象;times
为重复的次数,默认为1;length.out
为产生的向量长度,默认为NA(未限制);each
为每个元素重复的次数,默认为1。
例子:
rep(1:3,2) #输出1 2 3 1 2 3。前面的序列按原顺序重复2次
rep(1:3, each = 2) #输出1 1 2 2 3 3。序列中的每个元素重复2次。
rep(c(2,5),c(3,4)) #输出2 2 2 5 5 5 5 5,将向量c(2,5)按照后面给出的次数向量依次重复3次和4次。
#或者使用
x <- c(3,4)
rep(c(2,5),x) #也可以将y <- c(2,5),然后输出rep(y,x)
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次。
rep(c(2,4,6),times=3,length.out=5) #输出2 4 6 2 4。整体应该重复3次,但这里规定了长度,所以只有5项。
- 给元素命名
使用names()函数:
vn <- c(11,22,33,44)
names(vn) <- c("one","two","three","four") #对应元素的名字分别为one, two, three, four。
#或者使用
vn <- c(11,22,33,44)
myName <- c("one","two","three","four")
names(vn) <- myName
- 向量的索引
一、使用元素的位置索引
vc <- c(11,22,33,44,55,66)
vc[1] #提取第一个元素
vc[1:3] #提取第一个到第三个元素
vc[c(2,4,5)] #提取第二、四、五个元素
vc[-1] #提取除第一个元素之外的元素值
vc[-(1:3)] #提取除第一个到第三个元素之外的元素值
vc[-c(2,4,5)] #提取除第二、四、五个之外的元素值
注意:在R语言中,下标是从1开始的。
二、使用逻辑向量
vc <- c(11,22,33,44,55,66)
vc[c(TRUE,TRUE,FALSE,FALSE,TRUE,FALSE)] #提取对应位置为TRUE的元素值
#或者使用
x <- c(TRUE,TRUE,FALSE,FALSE,TRUE,FALSE)
vc[x]
vc[c(TRUE,FALSE)] #输出11 33 55
#这里的c(TRUE,FALSE)自动补齐到与vc向量长度相同,即
c(TRUE,FALSE,TRUE,FALSE,TRUE,FALSE)
三、使用元素名字
首先我们先要给向量中的每个元素命名
vc <- c(11,22,33,44,55,66)
names(vc) <- c("one","two","three","four","five","six")
vc["one"] #提取名称为"one"的元素,即11。
vc[c("one","three","six")] #输出11 33 66
图一
四、使用which()函数进行筛选
vc <- c(11,22,33,44,55,66)
which(vc == 11) #输出元素11的位置,即1。
which.min(vc) #找出最小元素所在的位置:1。
which.max(vc) #找出最大元素值所在的位置:6。
which(vc == 11 | vc == 33) #找出向量vc中元素值为11或33的元素所在位置:1 3。
which(vc > 11 & vc <= 44) #找出元素值大于11且小于44的元素所在位置:2 3 4。
vc[vc > 20 & vc < 60] #输出22 33 44 55。
#使用下面的代码也是等价的
vc[which(vc > 20 & vc < 60)]
图二
注意:which函数输出的是元素值的位置,而不是元素值本身;which函数括号内可以是逻辑表达式。
五、使用subset()函数索引
vc <- c(11,22,33,44,55,66)
subset(vc,c(TRUE,FALSE,TRUE)) #输出11 33 44 66。逻辑向量通过重复自动补齐
subset(vc,vc > 11 & vc < 55) #输出22 33 44
图三
用subset()函数进行筛选时,筛选过程中会自动忽略掉NA值,这是个很方便的去掉NA值的特性。
- 向量的编辑
一、扩展向量
vc <- c(11,22,33,44)
vc <- c(vc,c(55,66)) #输出11 22 33 44 55 66
#或者使用下面的形式
mc <- c(55,66)
vc <- c(vc,mc)
还可以使用append()函数。append()函数的函数原型如下:
append(x,values,after = length(x))
其中x
是要附加值的向量。values
包含在修饰向量。after
是下标,之后要附加值。
例子:
vc <- c(1:5) #输出1 2 3 4 5
mc <- c(0:1) #输出0 1
append(vc,mc,after = 3) #在3的后面加上0 1,输出1 2 3 0 1 4 5
只使用append()函数追加元素会生成一个新的向量,不会改变原向量的值。
二、改变元素的值
vc <- c(11,22,33,44,55,66)
vc[1] <- 111 #查找并引用元素1,直接将111赋给vc[1]
vc[1:3] <- 111 #向量vc中第一个到第三个元素的值都变为111
vc[1:3] <- c(111,222,333) #向量vc中第一个到第三个元素的值分别被修改为111 222 333
vc[vc > 33] <- 11 #将向量vc中的所有元素值大于 33 的元素值修改为11
vc[vc == 33] <- 11 #将向量vc中元素值为33的元素值修改为11
三、删除元素
vc <- c(11,22,33,44,55,66)
vc <- vc[-1] #先提取除第一个元素以外的值,再将这些值赋给vc。输出22 33 44 55 66
vc <- vc[-c(3:5)] #从vc中删除了位置为3,4,5的元素
vc <- vc[c(2:4)] #删除了出位置为2,3,4之外的元素(提取元素2,3,4)
- 向量的排序
一、sort()函数
sort()函数原型如下:
sort(x,decreasing = FALSE,na.last = NA,index.return = FALSE)
其中x
为要排序的对象;decreasing
为排序顺序,默认为FALSE
,即升序,TRUE
为降序;na.last
是对NA
(missing value
或者Not available
)值的处理。若为TRUE
,则NA
值将放在最后,若为FALSE
,NA
值将放在最前面,若为NA
,则排序时剔除掉NA
值;index.return
是逻辑参数。
例子:
vc <- c(10,NA,9,10,8,8,13,10,10,10,12)
sort(vc) #输出8 8 9 10 10 10 10 10 12 13。默认升序排序,NA值不参与排序,且被剔除掉
sort(vc,decreasing = TRUE) #降序排序,NA值默认被剔除掉
sort(vc,na.last = TRUE) #输出8 8 9 10 10 10 10 10 12 13 NA。默认升序排序,NA值不被剔除掉,且放在排序序列的后面
sort(vc,na.last = FALSE) #输出NA 8 8 9 10 10 10 10 10 12 13。默认升序排序,NA值不被剔除掉,且放在排序序列的前面
sort(vc, index.return = TRUE) 输出8 8 9 10 10 10 10 10 12 13。返回排序结果的位置索引值。即输出排序后的元素在原向量组的位置
注意:排序生成新的序列,不会影响原向量的值及顺序。
图五
二、order()函数
order()函数原型如下:
order(...,na.last = TRUE,decreasing = FALSE)
order()函数里的参数与sort()函数类似,不再进行重复。
例子:
x <- c(34,234,NA,3,1)
order(x) #输出5 4 1 2 3
order()函数与sort(x,index.return = TRUE)
是类似的。
图六
类似的还有rank()函数。
图七
order()函数与rank()函数的区别:
图八
三、rev()函数
rev()函数将向量倒序,即将原向量的元素按位置翻转。
vc <- c(11,44,33,22,77,66)
rev(vc) #输出66 77 22 33 44 11
sort(vc,reductioning = TRUE) #与上面的是等价的
类似地用法还可以用在降序排序中:
a <- c("e", "g", "a", "c")
rev(sort(a))
sort(a)
先将序列排列成:"a","c","e","g"
。然后rev(sort(a))
把序列的顺序倒过来:"g","e","c","a"
。
- 参考资料
《R语言实战》第二版
上述的使用帮助都可以使用help
函数进行查询。