冒号运算符:创建从某个数到另一个数的数字序列。
8.5:4.5 #8.5 7.5 6.5 5.5 4.5
c函数:拼接数值和向量,来创建更长的向量。
c(17,6:8,c(1,3),7) #17 6 7 8 1 3 7
vector函数能创建一个指定类型和长度的矢量。其结果中的值可为0、FALSE、空字符串、或任何相当于“nothing”的类型。例:
vector("numeric",5)
#0 0 0 0 0
vector("complex",5)
#0+0i 0+0i 0+0i 0+0i 0+0i
vector("logical",5)
#FALSE FALSE FALSE FALSE FALSE
vector("character",5)
#'' '' '' '' ''
vector("list",5)
#1.NULL
#2.NULL
#3.NULL
#4.NULL
#5.NULL
为方便起见,可以用每个类型的包装(wrapper)函数来创建矢量,这样可以节约打字时间,与上述代码的命令是等价的。
numeric(5) #0 0 0 0 0 complex(5) #0+0i 0+0i 0+0i 0+0i 0+0i logical(5) #FALSE FALSE FALSE FALSE FALSE character(5) #'' '' '' '' '' list(5) #1.5 ###list函数的工作方式与它们不一样
序列
seq函数能以许多不同的方式指定序列。
- seq.int可创建一个序列,序列的范围有两个数字指定,原理与冒号运算符完全相同:
seq.int(1,10) #1 2 3 4 5 6 7 8 9 10
- seq.int也可以指定步长,而冒号运算符不能:
seq.int(1,20,2) #1 3 5 7 9 11 13 15 17 19 seq.int(10,1,-1) #10 9 8 7 6 5 4 3 2 1
- seq_len函数将创建一个从1到它的输入值的序列,特别地,当输入值为0时,结果和预期的不一样:
n <- 5 seq_len(n) #1 2 3 4 5 n <- 0 1:n seq_len(n) #1 0
- seq_along函数创建一个从1开始,长度为其输入值的序列:
d <-c("one","two","three","four","five","sex","seven","eight","nine","ten")
for(i in seq_along(d)) print(d[i])
#[1] "one"
#[1] "two"
#[1] "three"
#[1] "four"
#[1] "five"
#[1] "sex"
#[1] "seven"
#[1] "eight"
#[1] "nine"
#[1] "ten"
长度
所有的向量都有一个长度,向量的长度是一个非负整数(向量的长度可以为0),可以通过length函数查找,缺失值也会被计入长度:
length(5:13) # 9 length(c(TRUE,FALSE,NA)) # 3
特别要强调的是字符向量,它的长度为字符串的数目,而非每个字符串中字符数的长度。如果要输出每个字符串中字符数的长度,可使用nchar:
e <- c("culture","forest","calculator","push")
length(e)
# 4
nchar(e)
#7 6 10 4
我们也可以为向量重新分配一个长度,如果向量的长度缩短,那么后面的值将被删除,如果长度增加,则缺失值会添加到最后:
f <- c(1,0,3,2,0,1,3,2) length(f) <- 4 f #1 0 3 2 length(f) <- 7 f #1 0 3 2
命名
R向量的一大特性是能给每个元素命名。使用name=value的形式在创建向量时为其指定名称。如果元素的名称是有效的,则无需被引号括起来。
- 只命名向量中的某些元素而忽略其他元素:
c(red = 1,green = 2,"blue black" = 3,4) #red 1 #green 2 #blue black 3 #4 4
- 也可以在向量创建后用names函数为元素添加名字:
x <- 1:4
names(x) <- c("red","green","blue black"," ")
x
#red 1
#green 2
#blue black 3
# 4
- names函数也可用于取得向量的名称:
names(x) #'red' 'green' 'blue black' ' '
- 如果向量中没有一个元素有名字,则names函数返回NULL:
names(1:4) #NULL
索引向量
索引是指访问向量中的部分或个别元素,通常用方括号来实现(有人也称之为子集、下标或切片)。R系统非常灵活,有如下多种索引方法:
- 给向量传入正数,它会返回此位置上的向量元素切片。它的第一个位置是1 (而不像其他某些语言一样是0)。
- 给向量传入负数,它会返回一个向量切片,它将包含除了这些位置以外的所有元素。
- 给向量传入一个逻辑向量,它会返回一个向量切片,里面只包含索引为TRUE的元素。
- 对于已命名的向量,给向量传人命名的字符向量,将会返回向量中包含这些名字的元素切片。
例:
x <- (1:6) * 2 x #2 4 6 8 10 12
以下三种索引方法对x进行索引都将返回相同的值:
x[c(2,4,6)] x[c(-1,-3,-5)] x[c(FALSE,TRUE,FALSE,TRUE,FALSE,TRUE)] #4 8 12 #4 8 12 #4 8 12
如果给元素命名,也能返回和上面代码相同的值:
names(x) <- c("two","four","six","eight","ten","twelve")
x[c("four","eight","twelve")]
#four 4
#eight 8
#twelve 12
- 混合使用正负值会抛出一个错误:
x[c(1,-1)] #Error in x[c(1, -1)]: 只有负下标里才能有零 #Traceback:
- 如果使用正数或逻辑值作为下标,缺失索引所对应的值同样也是缺失值:
x[c(2,NA,4,6)] #four 4 #2#eight 8 #twelve 12 x[c(FALSE,TRUE,FALSE,NA,TRUE,FALSE)] #four 4 #2 #ten 10
- 对于负的下标值是不允许存在缺失值的,会抛出一个错误:
x[c(-1,NA)] #Error in x[c(-1, NA)]: 只有负下标里才能有零 #Traceback:
- 超出范围的下标值不会报错,而会返回缺失值(NA),实际应用中,最好确保下标值在使用范围内:
x[7] #NA:
- 非整数(不包括分数)下标会默认向0舍入:
x[2.7] #four: 4 x[-2.7] #two 2 #six 6 #eight 8 #ten 10 #twelve 12
- 不传递任何下标值将返回整个向量:
x[] #two 2 #four 4 #six 6 #eight 8 #ten 10 #twelve 12
which函数将返回逻辑向量中为TRUE的位置,在将逻辑索引切换到整数索引时非常有用:
which(x > 7) #eight 4 #ten 5 #twelve 6
- which.min和which.max
which.min(x) #two: 1 which.max(x) #twelve: 6
向量循环与重复
- 一个单独的数字与向量相加,向量的每个元素都会与之相加:
1:6 + 2 #3 4 5 6 7 8 2 + 1:6 #3 4 5 6 7 8
- 两个长度成倍数的向量相加时,R会循环较短的向量配合较长的相加,向量长度不成倍数时,会出现一个警告:
1:6 + 7:12 #8 10 12 14 16 18 1:6 + 7:10 #Warning message in 1:6 + 7:10: #"长的对象长度不是短的对象长度的整倍数" #8 10 12 14 12 14
rep函数能重复使用元素来创建矢量:
rep(1:6,2) #1 2 3 4 5 6 1 2 3 4 5 6 rep(1:6,each = 2) #1 1 2 2 3 3 4 4 5 5 6 6 rep(1:6,times = 1:6) #1 2 2 3 3 3 4 4 4 4 5 5 5 5 5 6 6 6 6 6 6 rep(1:6,length.out = 10) #1 2 3 4 5 6 1 2 3 4 rep.int(1:6,2) #同rep(1:6,2)一样 #1 2 3 4 5 6 1 2 3 4 5 6
rep_len函数可指定输出向量的长度:
rep_len(1:6,17) #1 2 3 4 5 6 1 2 3 4 5 6 1 2 3 4 5



