• R语言数据结构-----列表


    目录

    (1)创建列表

     (2)列表索引

    (3)增加或删除列表元素

    (4)访问列表元素和值

    (5)apply()函数

    (6)递归型列表


    列表的基本操作

    1. > x<-list(u=2,v="abc")
    2. > x
    3. $u
    4. [1] 2
    5. $v
    6. [1] "abc"
    7. > x$u
    8. [1] 2

    函数hist()中的数据,也是通过列表保存的

    1. > hn<-hist(Nile)
    2. > print(hn)
    3. $breaks
    4. [1] 400 500 600 700 800 900 1000 1100 1200 1300 1400
    5. $counts
    6. [1] 1 0 5 20 25 19 12 11 6 1
    7. $density
    8. [1] 0.0001 0.0000 0.0005 0.0020 0.0025 0.0019 0.0012 0.0011 0.0006
    9. [10] 0.0001
    10. $mids
    11. [1] 450 550 650 750 850 950 1050 1150 1250 1350
    12. $xname
    13. [1] "Nile"
    14. $equidist
    15. [1] TRUE
    16. attr(,"class")
    17. [1] "histogram"
    18. #也可以用
    19. > str(hn)
    20. List of 6
    21. $ breaks : int [1:11] 400 500 600 700 800 900 1000 1100 1200 1300 ...
    22. $ counts : int [1:10] 1 0 5 20 25 19 12 11 6 1
    23. $ density : num [1:10] 0.0001 0 0.0005 0.002 0.0025 0.0019 0.0012 0.0011 0.0006 0.0001
    24. $ mids : num [1:10] 450 550 650 750 850 950 1050 1150 1250 1350
    25. $ xname : chr "Nile"
    26. $ equidist: logi TRUE
    27. - attr(*, "class")= chr "histogram"
    (1)创建列表
    1. #列表中各组件的名称叫标签
    2. > j<-list(name="Joe",salary=55000,union=T)
    3. > j
    4. $name
    5. [1] "Joe"
    6. $salary
    7. [1] 55000
    8. $union
    9. [1] TRUE
    10. #标签是可选的,也可以不指定
    11. > jalt<-list("Joe",55000,T)
    12. > jalt
    13. [[1]]
    14. [1] "Joe"
    15. [[2]]
    16. [1] 55000
    17. [[3]]
    18. [1] TRUE
    19. #但是一般来说推荐为各个部分取名而不用默认的数值,这样使得代码更加清晰
    20. #在使用时可以使用简称,只要不引起歧义
    21. > j$sal
    22. [1] 55000
    23. #因为列表是向量,所以可以用vector()创建列表
    24. > z[["abc"]]<-3
    25. > z
    26. $abc
    27. [1] 3
     (2)列表索引
    1. > j$salary
    2. [1] 55000
    3. > j[["salary"]]
    4. [1] 55000
    5. #可以用数字索引访问列表中的组件,但是要用双重中括号
    6. > j[[2]]
    7. [1] 55000
    8. []用于提取子集:[]可以用来提取数据结构中的一个或多个元素,并返回一个与原始结构类型相匹配的新结构
    9. > j[2]
    10. $salary
    11. [1] 55000
    12. [[]]用于提取单个元素或子列表:[[]]一次只能提取列表的一个组件,返回值是组件本身的类型,而不是列表
    13. > j[[2]]
    14. [1] 55000
    15. #只能提取列表中的一个组件
    16. > j[[1:2]]
    17. Error in j[[1:2]] : subscript out of bounds
    18. > j2a<-j[[2]]
    19. > j2a
    20. [1] 55000
    21. > class(j2a)
    22. [1] "numeric"
    23. > j[1:2]
    24. $name
    25. [1] "Joe"
    26. $salary
    27. [1] 55000
    28. > class(j2)
    29. [1] "list"
    30. > str(j2)
    31. List of 1
    32. $ salary: num 55000
    (3)增加或删除列表元素

    添加新的组件

    1. > z<-list(a="abc",b=12)
    2. > z
    3. $a
    4. [1] "abc"
    5. $b
    6. [1] 12
    7. > z$c <- "sailing"
    8. > z
    9. $a
    10. [1] "abc"
    11. $b
    12. [1] 12
    13. $c
    14. [1] "sailing"

    使用索引添加组件

    1. > z<-list(a="abc",b=12)
    2. > z[[4]]<-28
    3. > z[5:7]<-c(FALSE,TRUE,TRUE)
    4. > z
    5. $a
    6. [1] "abc"
    7. $b
    8. [1] 12
    9. [[3]]
    10. NULL
    11. [[4]]
    12. [1] 28
    13. [[5]]
    14. [1] FALSE
    15. [[6]]
    16. [1] TRUE
    17. [[7]]
    18. [1] TRUE

    删除列表元素可以直接把它的值设为NULL

    1. #删除z$b之后,它之后的元素索引全部减1,例如原来的z[[4]]变成了z[[3]]
    2. > z$b<-NULL
    3. > z
    4. $a
    5. [1] "abc"
    6. [[2]]
    7. NULL
    8. [[3]]
    9. [1] 28
    10. [[4]]
    11. [1] FALSE
    12. [[5]]
    13. [1] TRUE
    14. [[6]]
    15. [1] TRUE
    16. #把多个列表拼接成一个
    17. > c(list("Joe","55000",T),list(5))
    18. [[1]]
    19. [1] "Joe"
    20. [[2]]
    21. [1] "55000"
    22. [[3]]
    23. [1] TRUE
    24. [[4]]
    25. [1] 5

    获取列表长度

    1. > length(j)
    2. [1] 3
    (4)访问列表元素和值

    如果一个列表的各元素含有标签,就可以使用names()获取它的标签

    1. #如果一个列表的各元素含有标签,就可以使用names()获取它的标签
    2. > names(j)
    3. [1] "name" "salary" "union"
    4. #使用unlist()来获取列表的值
    5. #unlist()返回的值是一个向量---这里返回的是一个字符串向量,而且向量的元素名就来自原列表的标签
    6. > ulj<-unlist(j)
    7. > ulj
    8. name salary union
    9. "Joe" "55000" "TRUE"
    10. > class(ulj)
    11. [1] "character"
    12. #如果列表中都是数值,unlist()返回的就是数值向量
    13. > z<-list(a=5,b=12,c=13)
    14. > y<-unlist(z)
    15. > class(y)
    16. [1] "numeric"
    17. > y
    18. a b c
    19. 5 12 13
    20. #如果列表中既有字符串又有数值
    21. #混合类型的数值下R选择了这些类型中能最大程度地保留它们共同特性的类型:字符串
    22. #各种类型的优先级排序
    23. NULL<raw<逻辑类型<整型<实数类型<复数类型<列表<表达式
    24. > w<-list(a=5,b="xyz")
    25. > wu<-unlist(w)
    26. > class(wu)
    27. [1] "character"
    28. > wu
    29. a b
    30. "5" "xyz"

    重点

    #各种类型的优先级排序
    NULL

     如果把向量元素名称赋值为NULL,可以将其移除

    1. > x<-c(1,2,4)
    2. > names(x)
    3. NULL
    4. > names(x)<-c("a","b","ab")
    5. > names(x)
    6. [1] "a" "b" "ab"
    7. > x
    8. a b ab
    9. 1 2 4
    10. #把向量元素名称赋值为NULL,可以将其移除
    11. > names(x)<-NULL
    12. > x
    13. [1] 1 2 4
    14. #用名称来引用向量中的元素
    15. > x<-c(1,2,4)
    16. > names(x)<-c("a","b","ab")
    17. > x["b"]
    18. b
    19. > w<-list(a=5,b="xyz")
    20. > wu<-unlist(w)
    21. > names(wu)<-NULL
    22. > wu
    23. [1] "5" "xyz"
    24. #unname()函数直接去掉元素名
    25. > wun<-unname(wu)
    26. > wun
    27. [1] "5" "xyz"

    (5)apply()函数

    lapply()(代表list apply)与矩阵的apply()函数相似,对列表的每个组件执行特定的函数
    并返回另外一个列表

    1. > lapply(list(1:3,25:29),median)
    2. [[1]]
    3. [1] 2
    4. [[2]]
    5. [1] 27

     lapply()返回的列表可以转化为矩阵或向量的形式

    sapply()(代表simplified[l]apply)

    1. > sapply(list(1:3,25:29), median)
    2. [1] 2 27
    3. > z<-function(z)
    4. + return (c(z,z^2))
    5. > sapply(1:8,z)
    6. [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8]
    7. [1,] 1 2 3 4 5 6 7 8
    8. [2,] 1 4 9 16 25 36 49 64

    (6)递归型列表
    1. #生成包含两个组件的列表,每个组件本事都是列表
    2. > b<-list(u=5,v=12)
    3. > c<-list(w=13)
    4. > a<-list(b,c)
    5. > a
    6. [[1]]
    7. [[1]]$u
    8. [1] 5
    9. [[1]]$v
    10. [1] 12
    11. [[2]]
    12. [[2]]$w
    13. [1] 13
    14. > length(a)
    15. [1] 2
    16. > c(list(a=1,b=2,c=list(d=5,e=9)))
    17. $a
    18. [1] 1
    19. $b
    20. [1] 2
    21. $c
    22. $c$d
    23. [1] 5
    24. $c$e
    25. [1] 9
    26. #recursive默认为FALSE,得到一个递归型列表,其中组件c是另外一个列表
    27. #recursive=TRUE,得到的是向量,只有名称还带有原来递归的特征
    28. > c(list(a=1,b=2,c=list(d=5,e=9)),recursive=T)
    29. a b c.d c.e
    30. 1 2 5 9

  • 相关阅读:
    openEuler如何将中文语言改成英文
    【时间序列】流式多变量异常检测数据集NAB详细介绍
    Python迭代器和生成器
    微信小程序去除默认滚动条展示
    TiDB Lightning 常见问题
    高项 人力资源管理论文
    SPA项目开发之动态树+数据表格+分页
    随机森林知识点小总结
    MySQL进阶查询
    Golang封装一个request类支持socks和http代理
  • 原文地址:https://blog.csdn.net/weixin_69884785/article/details/132654651