R语言学习-列表

2024-07-18 07:54:53 浏览数 (2)

列表

list,是R的数据类型中最为复杂的一种。一般来书,列表就是一些对象(或成分,component)的有序集合。列表允许整合若干(可能无关的)对象到单个对象名下。

(1) 列表允许以一种简单的方式组织和重新调用不相干的信息。

(2) 许多R函数的运行结果都是以列表形式返回的。函数需要返回两个以上的变量时需要采用list形式返回。

列表的创建

使用list(。。。)创建列表,list(object1,object2...),其中object可以是到目前为止的提到的任何数据类型。比如:向量,矩阵,列表等

代码语言:R复制
> A <- "our one list"  #单个字符
> A1 <- c(1,2,3,4,7)   #向量
> A2 <- matrix(c(2,4,6,8),2,2,byrow = T)
> ourlist <- list(A,A1,A2)
> ourlist
[[1]]
[1] "our one list"

[[2]]
[1] 1 2 3 4 7

[[3]]
     [,1] [,2]
[1,]    2    4
[2,]    6    8

声明列表

之前提过如何建立一个向量,现在建立(声明)一个空列表也差不多

代码语言:R复制
> ourlist2 <- list() #建立或声明一个空向量
> mode(ourlist2)
[1] "list"

标签或者对象名的命名

每一个列表组件都可设置标签,就像向量的变量名或矩阵的行名一样,标签hi显示在$的后面。命名的方式很简单直接在建立列表时直接命名。

代码语言:R复制
> A <- "our one list"  #单个字符
> A1 <- c(1,2,3,4,7)   #向量
> A2 <- matrix(c(2,4,6,8),2,2,byrow = T)
> A3 <- list(c(1,2),c(3,4)) #列表
> ourlist3 <- list("字符"= A , A1 = A1,juzhen = A2,A3) #注意列表里嵌套一个列表
> ourlist3
$字符
[1] "our one list"

$A1
[1] 1 2 3 4 7

$juzhen
     [,1] [,2]
[1,]    2    4
[2,]    6    8

[[4]]
[[4]][[1]]
[1] 1 2

[[4]][[2]]
[1] 3 4

删除标签

这里讲的删除标签是删除列表中的所有标签,有两个函数可以使用

(1)使用unname()函数去掉标签

(2)使用NULL

代码语言:R复制
> W <- list(d3= c(1,2,3,4),d4 = c(5,6,7,8))
> W
$d3
[1] 1 2 3 4

$d4
[1] 5 6 7 8

> unname(W)
[[1]]
[1] 1 2 3 4

[[2]]
[1] 5 6 7 8
代码语言:R复制
> W <- list(d3= c(1,2,3,4),d4 = c(5,6,7,8))
> W
$d3
[1] 1 2 3 4

$d4
[1] 5 6 7 8

> names(W) <- NULL #给标签一个NULL值
> W
[[1]]
[1] 1 2 3 4

[[2]]
[1] 5 6 7 8

另外可以利用Names函数更换列表的标签

代码语言:R复制
> W <- list(d3= c(1,2,3,4),d4 = c(5,6,7,8))
> W
$d3
[1] 1 2 3 4

$d4
[1] 5 6 7 8

> names(W) <- c("嘿","哈")
> W
$嘿
[1] 1 2 3 4

$哈
[1] 5 6 7 8

列表元素的索引

列表元素的索引有多种,意识索引列表某组件,二是索引列表中某组件里的内容

一、索引列表某组件,可以通过标签索引一个组件整体,方法与向量,矩阵的访问差不多

代码语言:R复制
> A <- "our one list"  #单个字符
> A1 <- c(1,2,3,4,7)   #向量
> A2 <- matrix(c(2,4,6,8),2,2,byrow = T)
> A3 <- list(c(1,2),c(3,4)) #列表
> ourlist3 <- list("字符"= A , A1 = A1,juzhen = A2,A3) #注意列表里嵌套一个列表
> ourlist3["字符"] #无论有没有标签,可以直接使用组件序号索引
$字符
[1] "our one list"

> ourlist3[2]
$A1
[1] 1 2 3 4 7

二、索引列表某组件中的内容

如果没有标签,有两种方式索引组件内容

(1)使用$符号索引组件内容,变量名 $ 标签

(2)使用两个中括号,中括号里写标签,标签要用双引号

注意,无论有没有标签,都可以用两个中括号,中括号里写组件序号索引组件内容

代码语言:R复制
> W5 <- list(a = c(1,2),b= c(3,6),c(7,8)) #创建一个列表,两个有标签
> W5$a
[1] 1 2
> W5$b
[1] 3 6
> class(W5$a)
[1] "numeric"
> W5[["a"]] #使用两个中括号,中括号里写标签,标签要用双引号
[1] 1 2
> W5[[3]] #无论有没有标签,都可以用两个中括号,中括号里写组件序号索引组件内容
[1] 7 8

列表元素的增减

1,增加元素

当我有一个列表,已经创建完毕,但还需要加入元素,可以通过索引的方式赋值

方法一:通过两个中括号的方式,本来没有第三个,直接加一个进去

方法二:通过$符号,直接标签与内容一次性直接加进去

代码语言:R复制
> W5 <- list(a = c(1,2),b= c(3,6))
> W5[[3]] <-TRUE
> f <- c(8,9)
> W5[[3]] <- f
> W5
$a
[1] 1 2

$b
[1] 3 6

[[3]]
[1] 8 9

方法二

代码语言:R复制
> ourlist7 <- list(a = c("很好","非常好"),b = c("good","nice"))
> ourlist7$c <- "好极了"
> ourlist7
$a
[1] "很好"   "非常好"

$b
[1] "good" "nice"

$c
[1] "好极了"

> ourlist7[[3]]
[1] "好极了"
> 

2.减元素

把不需要的元素,直接赋值为NULL,之前提过NULL,表示啥也没有

代码语言:R复制
> ourlist7$b = NULL
> ourlist7
$a
[1] "很好"   "非常好"

$c
[1] "好极了"

注意,结合之前仿照向量使用负索引也可以的

代码语言:R复制
> ourlist7 <- list(a = c("很好","非常好"),b = c("good","nice"))
> R3 <- ourlist7[-2]
> R3
$a
[1] "很好"   "非常好"

> ourlist7
$a
[1] "很好"   "非常好"

$b
[1] "good" "nice"

获取标签

直接使用name()函数获取列表所有标签

代码语言:R复制
> ourlist7 <- list(a = c("很好","非常好"),b = c("good","nice"))
> names(ourlist7)
[1] "a" "b"
> unlist(ourlist7)
      a1       a2       b1       b2 
  "很好" "非常好"   "good"   "nice" 

解除列表

直接使用unlist()函数解除列表

列表相关函数

  1. lapply()函数 lapply()-list apply 给每个组件执行给定函数,返回列表,和矩阵apply()类似,同属于apply家族

使用方法:lapply(目标列表,函数)

代码语言:R复制
> W <- list(d3= c(1,2,3,4),d4 = c(5,6,7,8))
> lapply(W, mean)
$d3
[1] 2.5

$d4
[1] 6.5

> lapply(W, max)
$d3
[1] 4

$d4
[1] 8
  1. sapply()函数,与lapply()函数一样,只是返回的结果类型是向量> W <- list(d3= c(1,2,3,4),d4 = c(5,6,7,8))> sapply(W, mean) d3 d4 2.5 6.5 > class(sapply(W, max)) [1] "numeric"

0 人点赞