目录
(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(y)
[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
后续进行更加深入学习,会继续补充,请佬们持续关注💖💖💖