列表
R语言的6种模式:向量、矩阵、数组、数据框、列表、因子
向量、矩阵、数组所包含的元素的类型都是相同的
列表和数据框是两种特殊的类型,即允许把不同类型的数据合并在单一对象中
定义
列表是由一些对象的有序结合所构建的对象,其中的每个对象称为列表的分量(component),它们的长度和类型可以不同。
- 列表是R的数据类型中最为复杂的一种。
- 列表是一些对象(或成分component)的有序集合。
- 列表允许整合若干对象到单个对象名下
- 列表中可能包含向量,矩阵,数据框,甚至其他列表
- 列表类似于C语言的结构体类型,Python中的字典类型。从技术上讲,列表就是向量。之前我们接触的向量称为“原子型”向量,即向量的元素是最小的,不可再分的。而列表属于递归行向量。
创建列表(List)
语法:
mylist<-list(object1,object2…)
#或者
mylist<-list(name1=object1,name2=object2…)
以下是创建包含字符串,数字,向量的列表的示例:
> mylist<-list(name="Jack",wife="Rose",no.children=3,child.ages=c(4,7,9))
> mylist
$name
[1] "Jack"
$wife
[1] "Rose"
$no.children
[1] 3
$child.ages
[1] 4 7 9
-
列表各组件的名称叫做标签(tags)
-
列表的标签是可选的
-
> mylist$child.ages [1] 4 7 9 > mylist$chi [1] 4 7 9
-
在引用标签时,标签的名字可以简写,只要不引起歧义。
列表(List)元素的引用
>mylist<-list(name="Jack",wife="Rose",no.children=3,child.ages=c(4,7,9))
> mylist[[4]][2]
[1] 7
> mylist[2]
$wife
[1] "Rose"
> mylist[[2]]
[1] "Rose“
> mylist$wife
[1] "Rose“
> mylist[["wife"]]
[1] "Rose"
> class(mylist[2])
[1] "list"
> class(mylist[[2]])
[1] "character“
说明:
- 使用单中括号[]返回的是一个新的列表,是原列表的一个子列表
- 使用双中括号[[]]提取列表的组件,返回值是组件本身的类型,而不是列表
- 使用元素名称访问列表中的元素
创建如下形式的列表
![image-20220904104913693](https://gitee.com/wang-chuanqiYHQG/blogimag/raw/master/img/image-20220904104913693.png)
> mylist<-list(first=1,second=2,third=list(alpha=3.1,beta=3.2))
> mylist
$first
[1] 1
$second
[1] 2
$third
$third$alpha
[1] 3.1
$third$beta
[1] 3.2
生成如下子列表的索引操作
方法1:mylist[1:2]
方法2:mylist[-3]
方法3:mylist[c(“first”,”second”)]
方法4:mylist[c(TRUE,TRUE,FALSE)]
列表(List)元素的修改
#创建列表
> mylist<-list(name="Jack",wife="Rose",no.children=3,child.ages=c(4,7,9))
> mylist
$name
[1] "Jack"
$wife
[1] "Rose"
$no.children
[1] 3
$child.ages
[1] 4 7 9
#修改列表
#修改"name"属性的值
> mylist$name <-"John"
#扩展列
> mylist$income <-c(1980,1600)
> mylist
$name
[1] "John"
$wife
[1] "Rose"
$no.children
[1] 3
$child.ages
[1] 4 7 9
$income
[1] 1980 1600
#修改"income"属性的值
> mylist$income =NULL
> mylist
$name
[1] "John"
$wife
[1] "Rose"
$no.children
[1] 3
$child.ages
[1] 4 7 9
- 列表元素可以修改,只要把元素引用赋值即可
- 列表中的元素可以增加
- 可以删除列表中的某一项,将该项赋空值NULL
- 可以用连接函数c()连接多个列表或者列表中的某一项组成新的列表
由于列表是向量,可以使用length()
> length(mylist) #获得列表长度,即组件的个数
[1] 4
访问列表元素和值
使用names()获取列表各元素的标签
> names(mylist)
[1] "name" "wife" "no.children" "child.ages"
使用unlist()获取列表中各元素的值
> unlist(mylist) #返回一个字符向量
name wife no.children child.ages1 child.ages2 child.ages3
"John" "Rose" "3" "4" "7" "9"
> class(unlist(mylist))
[1] "character"
> z <-list(a=1,b=2,c=3)
> y <-unlist(z)
> y
a b c
1 2 3
> class(y) #unlist()返回一个数值向量
[1] "numeric"
结论:在混合类型的情况下(既有字符型又有数值型),R选择字符串作为数据类型。
去列表化
> z<-list(a=1,b=2,c=3)
> y<-unlist(z)
> y
a b c
1 2 3
去掉元素名:
#方法1
names(y)<-NULL
> y
[1] 1 2 3
#方法2:
y<-unname(y)
> y
[1] 1 2 3
在列表上使用apply系列函数
lapply()函数 :即 list apply,对列表中的每个组件执行相同的函数,并返回另一个列表
> mylist<-list(1:3,25:29)
> mylist
[[1]]
[1] 1 2 3
[[2]]
[1] 25 26 27 28 29
#R对列表中的组件求中位数,并返回由2和27组成的列表
> lapply(mylist,median)
[[1]]
[1] 2
[[2]]
[1] 27
我们对列表求中位数,上面返回的是一个列表,实际上我们只是想知道具体数值。
使用 sapply()函数,即 simplified apply,可以返回的列表可以转化成矩阵或者向量的形式
> sapply(mylist,median)
[1] 2 27
递归型列表
列表可以是递归的(recursive),即列表的组件也可以是列表
> b<-list(u=5,v=12)
> c<-list(w=13)
> a<-list(b,c)
> a
[[1]]
[[1]]$u
[1] 5
[[1]]$v
[1] 12
[[2]]
[[2]]$w
[1] 13
学生信息表,如果每个学生的数据存储为一个列表,则整个数据库就是由所有学生的列表组成的列表,就构成了递归型列表。