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


    目录

    (1)创建向量

     (2)访问元素

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

     (4)获取向量长度

    (5)切片操作

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

    (7)循环补齐

    (8)向量运算

    (9)向量索引

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

    (11)NA和NULL值

    (12)筛选

    (13)ifelse函数

    (14)测量向量相等

    (15)向量元素的名称

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


    (1)创建向量
    1. #使用c()函数创建向量,括号内为各个元素,用逗号分隔
    2. x <- c(1, 2, 3, 4, 5) # 数值型向量
    3. y <- c("a", "b", "c") # 字符型向量
    4. z <- c(TRUE, FALSE) # 逻辑型向量
    5. #使用:运算符创建向量
    6. > 5:8
    7. [1] 5 6 7 8
    8. > 5:1
    9. [1] 5 4 3 2 1
    10. > i<-2
    11. > 1:i-1 #意思为(1:i)-1
    12. [1] 0 1
    13. > 1:(i-1)
    14. [1] 1
    15. #使用seq()创建向量
    16. > seq(from=12,to=30,by=3)
    17. [1] 12 15 18 21 24 27 30
    18. > seq(from=1,to=2,length=10)
    19. [1] 1.000000 1.111111 1.222222 1.333333 1.444444 1.555556 1.666667
    20. [8] 1.777778 1.888889 2.000000
    21. #使用seq()重复向量常数
    22. > x<-rep(8,4)
    23. > x
    24. [1] 8 8 8 8
    25. > rep(c(5,12,13),3)
    26. [1] 5 12 13 5 12 13 5 12 13
    27. > rep(1:3,2)
    28. [1] 1 2 3 1 2 3
    29. > rep(c(5,12,13),each=2)
    30. [1] 5 5 12 12 13 13

     (2)访问元素
    1. #使用方括号[]访问向量中的元素,索引从1开始。
    2. x <- c(1, 2, 3, 4, 5)
    3. x[3] # 访问第3个元素,输出为3

    (3)添加或删除向量元素
    1. > x<-c(88,5,12,13)
    2. > x<-c(x[1:3],168,x[4])#在13前面添加168
    3. > x
    4. [1] 88 5 12 168 13

     (4)获取向量长度
    1. > x<-c(1,2,4)
    2. > length(x)
    3. [1] 3
    4. #向量长度一般运用于for()循环中
    5. > first1<-function(x){
    6. + for(i in 1:length(x)){
    7. + if(x[i]==1) break
    8. + }
    9. + return(i)
    10. + }
    11. 注意这里不能使用for(n in x):因为它不能获得所需元素的索引
    12. length(x)=0
    13. > x <- c()
    14. > x
    15. NULL
    16. > length(x)
    17. [1] 0
    18. > 1:length(x)
    19. [1] 1 0
    20. #循环过程中,变量i先取值为1,然后取值0
    21. 怎么解决这个问题
    22. for(i in 1:length(x))
    23. 改为
    24. for(i in seq(x))
    25. #seq(x)能正确计算出空值,导致上面迭代0
    26. > x<-c(5,12,13)
    27. > x
    28. [1] 5 12 13
    29. > seq(x)
    30. [1] 1 2 3
    31. > x<-NULL
    32. > seq(x)
    33. integer(0)

    (5)切片操作
    1. #使用方括号[]和冒号:进行切片操作,可以选择向量中的子集
    2. x <- c(1, 2, 3, 4, 5)
    3. x[2:4] # 输出:2 3 4

    (6)矩阵和数组本质上都是向量
    1. > m<-matrix(c(1:4),nrow=2)
    2. > m
    3. [,1] [,2]
    4. [1,] 1 3
    5. [2,] 2 4
    6. > m+10:13
    7. [,1] [,2]
    8. [1,] 11 15
    9. [2,] 13 17

    (7)循环补齐
    1. > c(1,2,4)+c(6,0,9,20,22)
    2. [1] 7 2 13 21 24
    3. Warning message:
    4. In c(1, 2, 4) + c(6, 0, 9, 20, 22) :
    5. longer object length is not a multiple of shorter object length
    6. > c(1,2,4,1,2)+c(6,0,9,20,22)
    7. [1] 7 2 13 21 24
    8. > x<-matrix(c(1:6),nrow=3)
    9. > x
    10. [,1] [,2]
    11. [1,] 1 4
    12. [2,] 2 5
    13. [3,] 3 6
    14. > x+c(1,2)
    15. [,1] [,2]
    16. [1,] 1+1 4+2
    17. [2,] 2+2 5+1
    18. [3,] 3+1 6+2
    19. (1,2,1,2,1,2)循环+

    (8)向量运算
    1. > 2+3
    2. [1] 5
    3. > "+"(2,3)
    4. [1] 5
    5. > x<-c(1,2,4)
    6. > x+c(5,0,-1)
    7. [1] 6 2 3
    8. > x*c(5,0,-1)
    9. [1] 5 0 -4
    10. > x<-c(1,2,4)
    11. > x/c(5,4,-1)
    12. [1] 0.2 0.5 -4.0
    13. > x%%c(5,4,-1)
    14. [1] 1 2 0
    15. 除了以上向量运算符,还有一个运算符">"
    16. > u<-c(5,2,8)
    17. > v<-c(1,3,9)
    18. > u>v
    19. [1] TRUE FALSE FALSE
    20. 因为5>1,所以为TRUE,其他同理,为false

    (9)向量索引
    1. > y<-c(1.2,3.9,0.4,0.12)
    2. > y[c(1,3)]
    3. [1] 1.2 0.4
    4. > y[2:3]
    5. [1] 3.9 0.4
    6. > v<-3:4
    7. > y[v]
    8. [1] 0.40 0.12
    9. > x<-c(4,2,17,5)
    10. > y<-x[c(1,1,3)]
    11. > y
    12. [1] 4 4 17
    13. #负数的下标表示我们想把相应元素剔除
    14. > z<-c(5,12,13)
    15. > z[-1]
    16. [1] 12 13
    17. > z[-1:-2]
    18. [1] 13
    19. #使用length()减去最后一个元素
    20. > z<-c(5,12,13)
    21. > z[1:(length(z)-1)]
    22. [1] 5 12
    23. > z[-length(z)]
    24. [1] 5 12

    (10)向量输入,矩阵输出
    1. > z<-function(z){
    2. + return (c(z,z^2))
    3. + }
    4. > x<-1:8
    5. > z(x)
    6. [1] 1 2 3 4 5 6 7 8 1 4 9 16 25 36 49 64
    7. 用矩阵方式输出
    8. > matrix(z(x),ncol=2)
    9. [,1] [,2]
    10. [1,] 1 1
    11. [2,] 2 4
    12. [3,] 3 9
    13. [4,] 4 16
    14. [5,] 5 25
    15. [6,] 6 36
    16. [7,] 7 49
    17. [8,] 8 64
    18. 也可以用sapply()函数
    19. > z<-function(z){
    20. + return (c(z,z^2))
    21. + }
    22. > sapply(1:8,z)
    23. [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8]
    24. [1,] 1 2 3 4 5 6 7 8
    25. [2,] 1 4 9 16 25 36 49 64
    (11)NA和NULL值
    1. #从下面的例子可以看出,如果有1个NA,那么计算的结果都为NA,na.rm=T,表示移除NA
    2. #而R会自动跳过空置(NULL)
    3. > x<-c(88,NA,12,168,13)
    4. > x
    5. [1] 88 NA 12 168 13
    6. > mean(x)
    7. [1] NA
    8. > mean(x,na.rm = T)
    9. [1] 70.25
    10. > x<-c(88,NULL,12,168,13)
    11. > mean(x)
    12. [1] 70.25
    13. #在不同向量中NA的模式不同
    14. > x<-c(5,NA,12)
    15. > mode(x[1])
    16. [1] "numeric"
    17. > mode(x[2])
    18. [1] "numeric"
    19. > y<-c("abc","def",NA)
    20. > mode(y[2])
    21. [1] "character"
    22. > mode(y[3])
    23. [1] "character"
    24. #NULL可以创建一个向量,每迭代一个,就在这个向量上增加一个元素
    25. > z<-NULL
    26. > for(i in 1:10)
    27. + if(i%%2==0)
    28. + z<-c(z,i)
    29. > z
    30. [1] 2 4 6 8 10
    31. > z<-NA
    32. > for(i in 1:10)
    33. + if(i%%2==0)
    34. + z<-c(z,i)
    35. > z
    36. [1] NA 2 4 6 8 10
    37. #所以NULL是作为不存在而计数的
    38. #以下例子看得更加明显
    39. > u<-NULL
    40. > length(u)
    41. [1] 0
    42. > v<-NA
    43. > length(v)
    44. [1] 1

    (12)筛选
    1. #筛选实际上是对布尔值进行筛选,例如
    2. > z<-c(5,2,-3,8)
    3. > j<-z*z>8
    4. > j
    5. [1] TRUE FALSE TRUE TRUE
    6. > y<-c(1,2,30,5)
    7. > y[j]
    8. [1] 1 30 5
    9. #通过布尔值筛选,只有TRUE才会输出
    10. > z<-c(5,2,-3,8)
    11. > y<-c(1,2,30,5)
    12. > y[z*z>8]
    13. [1] 1 30 5
    14. #这里更加直观,一定要注意理解,这里我们将z*z>8的结果作为向量y的索引,输出符合条件的y,即y[索引]
    15. #这个代码将x>3的数都换为0
    16. > x[x>3] <- 0
    17. which也同理,根据索引输出结果
    18. first1<-function(x){
    19. + for(i in 1:length(x)){
    20. + if(x[i]==1)
    21. + break
    22. + }
    23. + return(i)
    24. + }
    25. 以上代码是找出向量中第一个1,可以用which写为
    26. > first1<-function(x)
    27. + return (which(x==1)[1])

    (13)ifelse函数

    ifelse()函数的格式为ifelse(b,u,v)

    b表示一个布尔值,u,v为向量,如果b[i]为真,返回u[i],如果b[i]为假,返回v[i]

    1. #例一
    2. > x<-1:10
    3. > y<-ifelse(x%%2==0,5,12)
    4. > y
    5. [1] 12 5 12 5 12 5 12 5 12 5
    6. #例二
    7. > x<-c(5,2,9,12)
    8. > ifelse(x>6,2*x,3*x)
    9. [1] 15 6 18 24

    (14)测量向量相等
    1. > x<-1:3
    2. > y<-c(1,3,4)
    3. > x==y
    4. [1] TRUE FALSE FALSE
    5. #这样是不可行的
    6. #原因是==是一个向量化的函数,语句x==y是将函数==()应用到x和y的每一组元素中,得到布尔值向量
    7. #应该运用all()函数
    8. > x<-1:3
    9. > y<-c(1,3,4)
    10. > x==y
    11. [1] TRUE FALSE FALSE
    12. > x<-1:3
    13. > y<-c(1,3,4)
    14. > x==y
    15. [1] TRUE FALSE FALSE
    16. > all(x==y)
    17. [1] FALSE
    18. #也可以使用identical()函数
    19. > identical(x,y)
    20. [1] FALSE
    21. #但是实际上identical()函数,是判断两个对象是否完全一样
    22. > x<-1:2
    23. > y<-c(1,2)
    24. > x
    25. [1] 1 2
    26. > y
    27. [1] 1 2
    28. > identical(x,y)
    29. [1] FALSE
    30. > typeof(x)
    31. [1] "integer"
    32. > typeof(y)
    33. [1] "double"

    (15)向量元素的名称
    1. > x<-c(1,2,4)
    2. > names(x)
    3. NULL
    4. > names(x)<-c("a","ab","abc")
    5. > names(x)
    6. [1] "a" "ab" "abc"
    7. > x
    8. a ab abc
    9. 1 2 4
    10. > names(x)<-NULL
    11. > x
    12. [1] 1 2 4
    13. #可以用名称来引用向量中的元素
    14. > x<-c(1,2,4)
    15. > names(x)<-c("a","ab","abc")
    16. > x["ab"]
    17. ab
    18. 2

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

    字符型>复数型>数值型>逻辑型>整数型

    1. > c(5,2,"abc")
    2. [1] "5" "2" "abc"
    3. > c(5,2,list(a=1,b=4))
    4. [[1]]
    5. [1] 5
    6. [[2]]
    7. [1] 2
    8. $a
    9. [1] 1
    10. $b
    11. [1] 4

    (17)向量的扁平化效果

    1. > c(5,2,c(1.5,6))
    2. [1] 5.0 2.0 1.5 6.0

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

  • 相关阅读:
    预测评价指标
    MySQL 主从 AUTO_INCREMENT 不一致问题分析
    Vue进阶之Vue无代码可视化项目(三)
    Taurus .Net Core 微服务开源框架:Admin 插件【3】 - 指标统计管理 -【API、Redis、MemCache】
    代码随想录算法训练营第二十四天丨 回溯算法part02
    java虚拟机详解篇一(基础)
    docker环境,ubuntu18.04安装VTK8.2和PCL1.9.1
    稀疏数组及其应用
    [附源码]Python计算机毕业设计Django的黄河文化科普网站
    [NOIP2012 提高组] 国王游戏
  • 原文地址:https://blog.csdn.net/weixin_69884785/article/details/132654568