列表(List)是R中最复杂的数据类型,一般来说,列表是数据对象的有序集合,但是,列表的各个元素(item)的数据类型可以不同,每个元素的长度可以不同,是R中最灵活的数据类型。列表项可以是列表类型,因此,列表被认为是递归变量,与之相对,向量,数组,矩阵,数据框被认为是原子变量。
一,创建列表
列表由list()函数创建,每个参数使用逗号分割,用于指定列表项的内容,列表中的元素数量不限,类型不限。列表项的名称是可选的,可以创建无名的列表项;列表的每一个item,都可以显示命名,例如,name1=item1, name2=item2。
list([name1=]item1,[name2=]item2,...)
1,创建的无名的列表项
例如,下面的脚本创建一个列表,该列表共有三个item,第一个item是整数向量,第二个item是字符向量,第三个item是矩阵,列表的每一个item都没有名称:
> a_list=list( + c(1:3), + month.abb, + matrix(c(-1,-2,-3,-4),nrow=2) + )
打印列表,列表的第一个item,使用两个嵌套的中括号[[1]]表示,这是索引列表的一种方式:
> a_list [[1]] [1] 1 2 3 [[2]] [1] "Jan" "Feb" "Mar" "Apr" "May" "Jun" "Jul" "Aug" "Sep" "Oct" "Nov" "Dec" [[3]] [,1] [,2] [1,] -1 -3 [2,] -2 -4
2,创建命名的列表项
通过指定列表项的变量名,为每一个列表项显示指定名称,列表项的命名是变量名,不需要加双引号:
> a_list=list( + a=c(1:3), + b=month.abb, + c=matrix(c(-1,-2,-3,-4),nrow=2) + ) > a_list $a [1] 1 2 3 $b [1] "Jan" "Feb" "Mar" "Apr" "May" "Jun" "Jul" "Aug" "Sep" "Oct" "Nov" "Dec" $c [,1] [,2] [1,] -1 -3 [2,] -2 -4
二,列表元素的命名
使用函数names(list)查看列表中每个item的名称,如果创建列表是无名列表项,那么该函数返回NULL;可以对该函数names(list)赋值,为列表的每个item命名:
> names(a_list)=c(‘first‘,‘second‘,‘third‘) > a_list $first [1] 1 2 3 $second [1] "Jan" "Feb" "Mar" "Apr" "May" "Jun" "Jul" "Aug" "Sep" "Oct" "Nov" "Dec" $third [,1] [,2] [1,] -1 -3 [2,] -2 -4 > names(a_list) [1] "first" "second" "third"
三,列表的长度
列表没有维度,列表和向量一样,有长度(length),可以使用函数length()获取列表的长度,列表的长度是列表的顶层item的数量,不包括嵌套的列表项。
> length(a_list) [1] 3
函数NROW(),NCOL()把列表看作向量,是只有一列,多行的数据结构,因此NCOL(x)始终返回1,而NROW(x)返回的值和length(x)相同
> NCOL(a_list) [1] 1 > NROW(a_list) [1] 3
四,索引列表
可以使用中括号索引列表的元素,下标有四种表示方法:正整数,负整数,元素名称或逻辑索引,例如,a_list[1:2], a_list[-3], a_list[c(‘first‘,‘second‘)], a_list[c(TURE,TRUE,FALSE)] 这四种方法返回的结果相同:
> a_list[1:2] $first [1] 1 2 3 $second [1] "Jan" "Feb" "Mar" "Apr" "May" "Jun" "Jul" "Aug" "Sep" "Oct" "Nov" "Dec"
这些索引操作的结果是另一个列表,这意味着,使用单个中括号,返回的是一个新的列表,要访问列表元素的内容,有两种方式:使用嵌套的中括号(传入正整数,代表列表项的下标,或传入字符串,代表列表项的名称),或指定元素的名称。
例如,通过嵌套的中括号和下标,获取列表的第一个项目(item)的值:
> a_list[[1]] [1] 1 2 3
例如,通过指定元素的名称作为下标,获取列表的第一个项目(item)的值:
> a_list$first [1] 1 2 3
在访问列表的元素之后,可以通过中括号访问列表项的元素值,例如,列表的第一个项目是向量,通过中括号和下标,能够访问向量的第一个元素的值:
> a_list$first[1] [1] 1 > a_list[[1]][1] [1] 1
如果以错误的正整数索引访问列表元素的内容,R会抛出下标越界的错误,而使用错误的列表项(item)的名称,R会返回NULL值,不会报错:
> a_list[[4]] Error in a_list[[4]] : subscript out of bounds > a_list$forth NULL
五,NULL值和NA值
NULL是个特殊值,表示未知值,NA表示缺失值,NULL和NA之间最大的区别是:NA是一个标量值,长度为1,而NULL不会占用任何空间,长度为零:
> length(NA) [1] 1 > length(NULL) [1] 0
使用is.null函数验证NULL值,使用is.na函数验证NA值:
> is.null(NULL) [1] TRUE > is.na(NA) [1] TRUE
六,列表项的追加、删除和更新
列表创建之后,可以向列表中追加元素,也可以删除现有的列表元素
1,删除列表元素
NULL能够用于删除列表中的元素,把列表项设置为NULL,则会删除该列表项,在该列表项之后的元素,其索引都要减少1:
例如,把第一个列表项删除,原第二个列表项的索引变成1,原第三个列表的索引变成2:
a_list[1]=NULL > a_list $second [1] "Jan" "Feb" "Mar" "Apr" "May" "Jun" "Jul" "Aug" "Sep" "Oct" "Nov" "Dec" $third [,1] [,2] [1,] -1 -3 [2,] -2 -4
2,追加列表元素
项列表中追加新的列表项,可以使用嵌套的中括号(在列表末尾追加未命名的列表项),或直接使用新的列表项的名称(在列表末尾追加已命名的列表项):
> a_list[[3]]=c(1:3) > a_list$fifth=c(‘a‘,‘b‘) > a_list $second [1] "Jan" "Feb" "Mar" "Apr" "May" "Jun" "Jul" "Aug" "Sep" "Oct" "Nov" "Dec" $third [,1] [,2] [1,] -1 -3 [2,] -2 -4 [[3]] [1] 1 2 3 $fifth [1] "a" "b"
3,列表项的更新
更新列表项,这可以通过直接访问列表项,把列表项赋值为新的变量的值来实现,例如,把列表的第三个列表项修改为list变量:
> a_list[[3]]=list(‘L1‘,‘L2‘) > a_list[[3]] [[1]] [1] "L1" [[2]] [1] "L2"
七,列表和向量的相互转换
向量可以使用函数as.list函数转换成列表,所创建的列表和向量中的元素一一对应:
> v=c(1,3) > (l=as.list(v)) [[1]] [1] 1 [[2]] [1] 3
列表既能存储相同的类型的数据,也能存储不同类型的数据,如果列表的所有列表项的数据类型相同,可以通过unlist函数把列表转换成向量:
> unlist(l) [1] 1 3
参考文档:
原文地址:https://www.cnblogs.com/ljhdo/p/4907882.html