列表(List)是R中最复杂的数据类型,一般来说,列表是数据对象的有序集合,但是,列表的各个元素(item)的数据类型可以不同,每个元素的长度可以不同,是R中最灵活的数据类型。列表项可以是列表类型,因此,列表被认为是递归变量,与之相对,向量,数组,矩阵,数据框被认为是原子变量。
列表由list()函数创建,每个参数使用逗号分割,用于指定列表项的内容,列表中的元素数量不限,类型不限。列表项的名称是可选的,可以创建无名的列表项;列表的每一个item,都可以显示命名,例如,name1=item1, name2=item2。
list([name1=]item1, [name2=]item2, ...)
1.创建列表
例如,下面的脚本创建一个列表,该列表共有2个item,第一个item是names 学生姓名,第二个item是ID,表示学生的学号。names和ID叫标签。
> students = list( names = c("Tom","Ammy","BioInfoCloud"),ID = c(1,2,3))
> students
$names
[1] "Tom" "Ammy" "BioInfoCloud"
$ID
[1] 1 2 3
# 创建列表是可以不创建标签。
> student = list( c("Tom","Ammy","BioInfoCloud"),c(1,2,3))
> student
[[1]]
[1] "Tom" "Ammy" "BioInfoCloud"
[[2]]
[1] 1 2 3
2.访问列表中组件
访问列表中组件的方法,用$
符号或者[[]]
。
> students$names
[1] "Tom" "Ammy" "BioInfoCloud"
> students[[1]]
[1] "Tom" "Ammy" "BioInfoCloud"
> students[["ID"]]
[1] 1 2 3
>
[[]]
一次只能提取一个组件,返回的类型是组件的类型,不是列表。
> class(students[["ID"]]) # 判断类型
[1] "numeric"
3.增加或删除列表中的元素
> students$country = c("English","America","China")
> students
$names
[1] "Tom" "Ammy" "BioInfoCloud"
$ID
[1] 1 2 3
$country
[1] "English" "America" "China"
> students$ID = NULL
> students
$names
[1] "Tom" "Ammy" "BioInfoCloud"
$country
[1] "English" "America" "China"
4.访问列表元素和值
如果列表定义了标签,可以用names()函数获取。
> names(students)
[1] "names" "country"
>
可以用unlist()函数获取值,unlist()返回值就是一个向量,向量名来自标签。
> unlist(students)
names1 names2 names3 country1 country2
"Tom" "Ammy" "BioInfoCloud" "English" "America"
country3
"China"
5.递归型列表
列表是可以递归的,意思是列表的组件可以是列表。
> 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
> length(a)
[1] 2
>
这段代码生成一个包含2个组件的列表,每个组件本身也是列表,拼接函数c()有一个可选参数recursive,决定在拼接列表时是否把原列表"压平",就是把所有组件元素都提取出来,组合成一个向量。
> c(list(a=1,b=2,c=list(d=5,e=9)),recursive = T)
a b c.d c.e
1 2 5 9
网友评论