列表
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()函数解除列表
列表相关函数
- 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
- 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"