R语言数据结构-----向量

目录

(1)创建向量

 (2)访问元素

(3)添加或删除向量元素

 (4)获取向量长度

(5)切片操作

(6)矩阵和数组本质上都是向量

(7)循环补齐

(8)向量运算

(9)向量索引

(10)向量输入,矩阵输出

(11)NA和NULL值

(12)筛选

(13)ifelse函数

(14)测量向量相等

(15)向量元素的名称

(16)c()中不同类型优先级排序


(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

后续进行更加深入学习,会继续补充,请佬们持续关注💖💖💖

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值