列表 List
列表是数据框和面向对象编程的基础。 列表可以组合多个不同类型的对象。
创建列表
使用list()函数创建列表
list(value,value,...)
或
list(tag = value, tag = value, ...)
tag:组件名称,标签
使用vector()创建列表
z <- vector(mode = 'list')
z[['abc']] <- 3
列表是向量,是“递归型”向量(recursive),普通向量为“原子型”向量(atomic)
使用as.list(x)将对象强制转化为列表
列表的操作
列表索引
索引类型
使用标签名:
listName$tagName该方法可以使用标签名的简写,使用的时候标签名可以简写,只写出前几个字母,只要不引起歧义。listName[['tagName']]注意双重中括号,且标签名用引号包围,不可使用标签名的简写
使用数字索引:
- listName[[tagNumber]],注意双重中括号,且标签数字不用引号
返回值
该组件,且与该组件在list中类型相同
使用单重中括号与双重中括号的区别:
- 使用单中括号:
- 可以使用组件名和数字索引提取列表元素;
- 可以同时提取多个组件,只需将参数写为向量类型,返回值是一个新的列表,它是原列表的子列表,可以提取多个组件:
listName[c('tagName1', 'tagName2', ...] listName[c(1, 2, 3,...)] - 使用双重中括号:
- 一次只能提取列表的一个组件;
- 返回值是组件本身的类型,不是列表,例如组件是一个数据框,则返回数据框。
增加列元素
- 使用组件名增加新的组件:
listName$newTag <- value - 使用数字索引增加组件:
listName[[newNumber]] <- value listName[c(...)] <- c(...)
删除列元素
将列元素的值设为NULL,之后的元素索引全部减1。
拼接列表
c(list1, list2, ...)
获取列表的长度
length(listName):返回值为列表的组件个数;
访问列表元素和值
- 使用
names(listName)获取列表的标签名称,如果有的话; 使用unlist(listName)获取列表的值,去列表化:
- 返回值是一个向量,向量的元素名是原列表的标签名,所有元素类型相同;
- 若列表元素为混合类型,则遵循以下原则:
- 在混合类型的情形下,R选择这些类型中能最大程度地保留它们共同特性的类型,通常是字符串向量;
- R的各种类型之间有优先级结构,排序为:NULL < raw < 逻辑类型 < 整型 < 实数类型 < 复数类型 < 列表 < 表达式;
将返回向量的元素名去掉:
names(vectorName) <- NULLunname(vectorName)直接去掉元素名
在列表上使用apply系列函数
- lapply(X, FUN, ...)函数
- list apply:对列表(或强制转换成列表的向量)的每个组件执行给定的函数,并返回另一个列表
- sapply(X, FUN, ..., simplify = TRUE, USE.NAMES = TRUE)函数
- simplified lappy:返回值可以转化为向量或矩阵形式
递归型列表
递归性(recursive):列表的组件也可以是列表
取消递归性:
- 拼接列表:c()有个可选参数recursive,决定在拼接列表的时候,是否把原列表“压平”,即把所有的组件的元素都提取出来,组成一个向量