目录
- #使用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
- #使用方括号[]访问向量中的元素,索引从1开始。
- x <- c(1, 2, 3, 4, 5)
- x[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
- > 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)
- #使用方括号[]和冒号:进行切片操作,可以选择向量中的子集
- x <- c(1, 2, 3, 4, 5)
- x[2:4] # 输出:2 3 4
- > 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
- > 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)循环+
- > 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
-
-
- > 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
- > 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
- #从下面的例子可以看出,如果有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
- #筛选实际上是对布尔值进行筛选,例如
- > 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])
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
- > 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"
- > 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
字符型>复数型>数值型>逻辑型>整数型
- > 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
后续进行更加深入学习,会继续补充,请佬们持续关注💖💖💖