1)创建向量
#使用c()函数创建向量,括号内为各个元素,用逗号分隔 x <- c(1, 2, 3, 4, 5) # 数值型向量 y <- c("a", "b", "c") # 字符型向量 z <- c(TRUE, FALSE) # 逻辑型向量 #使用:运算符创建向量 > 5:8 [1] 5 6 7 8 > 5:1 [1] 5 4 3 2 1 > i<-2 > 1:i-1 #意思为(1:i)-1 [1] 0 1 > 1:(i-1) [1] 1 #使用seq()创建向量 > seq(from=12,to=30,by=3) [1] 12 15 18 21 24 27 30 > seq(from=1,to=2,length=10) [1] 1.000000 1.111111 1.222222 1.333333 1.444444 1.555556 1.666667 [8] 1.777778 1.888889 2.000000 #使用seq()重复向量常数 > x<-rep(8,4) > x [1] 8 8 8 8 > rep(c(5,12,13),3) [1] 5 12 13 5 12 13 5 12 13 > rep(1:3,2) [1] 1 2 3 1 2 3 > rep(c(5,12,13),each=2) [1] 5 5 12 12 13 13
(2)访问元素
#使用方括号[]访问向量中的元素,索引从1开始。 x <- c(1, 2, 3, 4, 5) x[3] # 访问第3个元素,输出为3
(3)添加或删除向量元素
> x<-c(88,5,12,13) > x<-c(x[1:3],168,x[4])#在13前面添加168 > x [1] 88 5 12 168 13
(4)获取向量长度
> x<-c(1,2,4) > length(x) [1] 3 #向量长度一般运用于for()循环中 > first1<-function(x){ + for(i in 1:length(x)){ + if(x[i]==1) break + } + return(i) + } 注意这里不能使用for(n in x):因为它不能获得所需元素的索引 若length(x)=0 > x <- c() > x NULL > length(x) [1] 0 > 1:length(x) [1] 1 0 #循环过程中,变量i先取值为1,然后取值0 怎么解决这个问题 将 for(i in 1:length(x)) 改为 for(i in seq(x)) #seq(x)能正确计算出空值,导致上面迭代0次 > x<-c(5,12,13) > x [1] 5 12 13 > seq(x) [1] 1 2 3 > x<-NULL > seq(x) integer(0)
(5)切片操作
#使用方括号[]和冒号:进行切片操作,可以选择向量中的子集 x <- c(1, 2, 3, 4, 5) x[2:4] # 输出:2 3 4
(6)矩阵和数组本质上都是向量
> m<-matrix(c(1:4),nrow=2) > m [,1] [,2] [1,] 1 3 [2,] 2 4 > m+10:13 [,1] [,2] [1,] 11 15 [2,] 13 17
(7)循环补齐
> c(1,2,4)+c(6,0,9,20,22) [1] 7 2 13 21 24 Warning message: In c(1, 2, 4) + c(6, 0, 9, 20, 22) : longer object length is not a multiple of shorter object length > c(1,2,4,1,2)+c(6,0,9,20,22) [1] 7 2 13 21 24 > x<-matrix(c(1:6),nrow=3) > x [,1] [,2] [1,] 1 4 [2,] 2 5 [3,] 3 6 > x+c(1,2) [,1] [,2] [1,] 1+1 4+2 [2,] 2+2 5+1 [3,] 3+1 6+2 (1,2,1,2,1,2)循环+
(8)向量运算
> 2+3 [1] 5 > "+"(2,3) [1] 5 > x<-c(1,2,4) > x+c(5,0,-1) [1] 6 2 3 > x*c(5,0,-1) [1] 5 0 -4 > x<-c(1,2,4) > x/c(5,4,-1) [1] 0.2 0.5 -4.0 > x%%c(5,4,-1) [1] 1 2 0 除了以上向量运算符,还有一个运算符">" > u<-c(5,2,8) > v<-c(1,3,9) > u>v [1] TRUE FALSE FALSE 因为5>1,所以为TRUE,其他同理,为false
(9)向量索引
> y<-c(1.2,3.9,0.4,0.12) > y[c(1,3)] [1] 1.2 0.4 > y[2:3] [1] 3.9 0.4 > v<-3:4 > y[v] [1] 0.40 0.12 > x<-c(4,2,17,5) > y<-x[c(1,1,3)] > y [1] 4 4 17 #负数的下标表示我们想把相应元素剔除 > z<-c(5,12,13) > z[-1] [1] 12 13 > z[-1:-2] [1] 13 #使用length()减去最后一个元素 > z<-c(5,12,13) > z[1:(length(z)-1)] [1] 5 12 > z[-length(z)] [1] 5 12
(10)向量输入,矩阵输出
> z<-function(z){ + return (c(z,z^2)) + } > x<-1:8 > z(x) [1] 1 2 3 4 5 6 7 8 1 4 9 16 25 36 49 64 用矩阵方式输出 > matrix(z(x),ncol=2) [,1] [,2] [1,] 1 1 [2,] 2 4 [3,] 3 9 [4,] 4 16 [5,] 5 25 [6,] 6 36 [7,] 7 49 [8,] 8 64 也可以用sapply()函数 > z<-function(z){ + return (c(z,z^2)) + } > sapply(1:8,z) [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [1,] 1 2 3 4 5 6 7 8 [2,] 1 4 9 16 25 36 49 64
(11)NA和NULL值
#从下面的例子可以看出,如果有1个NA,那么计算的结果都为NA,na.rm=T,表示移除NA #而R会自动跳过空置(NULL) > x<-c(88,NA,12,168,13) > x [1] 88 NA 12 168 13 > mean(x) [1] NA > mean(x,na.rm = T) [1] 70.25 > x<-c(88,NULL,12,168,13) > mean(x) [1] 70.25 #在不同向量中NA的模式不同 > x<-c(5,NA,12) > mode(x[1]) [1] "numeric" > mode(x[2]) [1] "numeric" > y<-c("abc","def",NA) > mode(y[2]) [1] "character" > mode(y[3]) [1] "character" #NULL可以创建一个向量,每迭代一个,就在这个向量上增加一个元素 > z<-NULL > for(i in 1:10) + if(i%%2==0) + z<-c(z,i) > z [1] 2 4 6 8 10 > z<-NA > for(i in 1:10) + if(i%%2==0) + z<-c(z,i) > z [1] NA 2 4 6 8 10 #所以NULL是作为不存在而计数的 #以下例子看得更加明显 > u<-NULL > length(u) [1] 0 > v<-NA > length(v) [1] 1
(12)筛选
#筛选实际上是对布尔值进行筛选,例如 > z<-c(5,2,-3,8) > j<-z*z>8 > j [1] TRUE FALSE TRUE TRUE > y<-c(1,2,30,5) > y[j] [1] 1 30 5 #通过布尔值筛选,只有TRUE才会输出 > z<-c(5,2,-3,8) > y<-c(1,2,30,5) > y[z*z>8] [1] 1 30 5 #这里更加直观,一定要注意理解,这里我们将z*z>8的结果作为向量y的索引,输出符合条件的y,即y[索引] #这个代码将x>3的数都换为0 > x[x>3] <- 0 which也同理,根据索引输出结果 first1<-function(x){ + for(i in 1:length(x)){ + if(x[i]==1) + break + } + return(i) + } 以上代码是找出向量中第一个1,可以用which写为 > first1<-function(x) + return (which(x==1)[1])
(13)ifelse函数
ifelse()函数的格式为ifelse(b,u,v)
b表示一个布尔值,u,v为向量,如果b[i]为真,返回u[i],如果b[i]为假,返回v[i]
#例一 > x<-1:10 > y<-ifelse(x%%2==0,5,12) > y [1] 12 5 12 5 12 5 12 5 12 5 #例二 > x<-c(5,2,9,12) > ifelse(x>6,2*x,3*x) [1] 15 6 18 24 (14)测量向量相等 > x<-1:3 > y<-c(1,3,4) > x==y [1] TRUE FALSE FALSE #这样是不可行的 #原因是==是一个向量化的函数,语句x==y是将函数==()应用到x和y的每一组元素中,得到布尔值向量 #应该运用all()函数 > x<-1:3 > y<-c(1,3,4) > x==y [1] TRUE FALSE FALSE > x<-1:3 > y<-c(1,3,4) > x==y [1] TRUE FALSE FALSE > all(x==y) [1] FALSE #也可以使用identical()函数 > identical(x,y) [1] FALSE #但是实际上identical()函数,是判断两个对象是否完全一样 > x<-1:2 > y<-c(1,2) > x [1] 1 2 > y [1] 1 2 > identical(x,y) [1] FALSE > typeof(x) [1] "integer" > typeof
[1] "double"
(15)向量元素的名称
> x<-c(1,2,4) > names(x) NULL > names(x)<-c("a","ab","abc") > names(x) [1] "a" "ab" "abc" > x a ab abc 1 2 4 > names(x)<-NULL > x [1] 1 2 4 #可以用名称来引用向量中的元素 > x<-c(1,2,4) > names(x)<-c("a","ab","abc") > x["ab"] ab 2
(16)c()中不同类型优先级排序
字符型>复数型>数值型>逻辑型>整数型
> c(5,2,"abc") [1] "5" "2" "abc" > c(5,2,list(a=1,b=4)) [[1]] [1] 5 [[2]] [1] 2 $a [1] 1 $b [1] 4
(17)向量的扁平化效果
> c(5,2,c(1.5,6)) [1] 5.0 2.0 1.5 6.0