向量(标量、向量、矩阵、数组)等的元素要求都是同类型的;而列表可以组合不同类型的对象。
1、创建列表list()
exp:j <- list(name="AAA",salary=55000,union=T)
输出:
$name
AAA
$salary
55000
$union
TRUE
简写方式:j <- list("AAA",55000,T)
向量式创建:z <- vector(mode="list") z[["abc"]] <-3
2、列表常规操作
列表索引:exp:j$salary、j[["salary"]]、j[[2]] 输出55000【注意:使用两个中括号】
j[1:2]则输出列表:
$name
"AAA"
$salary
55000
增加或删除列表元素:
exp:
z <- list(a="abc",b=12)
z$c <- "sailing" #名称赋值方式添加列表元素(组件)
z[[4]] = 28 #索引位置赋值方式添加列表元素(组件)
z[5:7] <- c(FALSE,TRUE,FALSE) #使用向量赋值添加列表组件
z$b <- NULL #删除列表元素(组件)删除之后后面的索引前移
c(z,list(5)) #列表拼接
length(z) 获取列表长度
案例:文本词汇索引
Code:
findwords <- function(tf){
txt <- scan(tf,"") #扫描(读取)文件 生成一个字符串向量 每一个单词是一个向量元素
wl <- list() #创建一个列表 用于存储检索结果
for(i in 1:length(txt)) {
wrd <- txt[i] #当前循环处的单词
wl[[wrd]] <- c(wl[[wrd]],i) #将当前单词添加索引(循环次数)后填充至list()列表 (当第二次及以后遇到同名单词时 会追加到第一个同名list()元素上)
}
return(wl) #返回所有单词的索引列表
}
3、列表元素访问
names():获取列表元素标签(命名)
unname():去掉元素名
unlist():获取列表值 返回向量
类型优先级排序:NULL<raw<逻辑类型<整型<实数类型<复数类型<列表<表达式(配对列表pairlist当做普通列表)
4、列表上使用apply()函数
lapply():对列表的每个组件执行给定的函数 返回结果列表 exp: lapply(list(1:3,25:29),median) 表示分别对1 2 3和25 26 27 28 29求中位数 返回 list(2,27)
sapply():将列表转化为矩阵或向量 exp:sapply(list(1:3,25:29),median) 返回 matrix(c(2,27))
案例:文本词汇索引(续)
Code:
alphawl <- function(wrdlst) {
nms <- names(wrdlst) #元素名(单词)
sn <- sort(nms) #按元素名排序
return(wrdlst[sn])
}
freqwl <- function(wrdlst) {
freqs <- sapply(wrdlst,length) #获取每个列表组件的长度(即单词个数)
return(wrdlst[order(freqs)]) #重新按词频排序后赋值给原列表并返回
}
扩展案例:用图形展示文章中使用最频繁的10个单词
Code:
nyt <- findwords("nyt,txt") #把一篇文章按单词进行索引 返回一个列表
ssnyt <- freqwl(nyt) #按词频排序
nwords <- length(ssnyt) #总单词数
freqwl <- sapply(ssnyt[round(0.9*nwords):nwords],length) #取前面的10% 并使用length()函数获取其长度(使用次数)
barplot(freqwl) #绘图
扩展案例:鲍鱼数据(向量篇曾经使用该案例)
Code:
g <- c("M","F","F","I","M","M","F") #鲍鱼性别 M雄性 F雌性 I幼虫
lapply(c("M","F","I"),function(gender) which(g==gender)) #返回g中元素分别等于M、F、I的索引向量组成的列表
输出:
[[1]]
1 5 6
[[2]]
2 3 7
[[3]]
4
5、递归型列表(嵌套型列表)
列表是可以递归的 即列表的组件也可以是列表 个人觉得使用“嵌套型列表”更形象
exp:
b <- list(u = 5, v = 12)
c <- list(w = 13)
a <- list(b,c)
输出:
[[1]]
[[1]]$u
5
[[1]]$v
12
[[2]]
[[2]]$w
13
length(a)
2
【注】:从上面的返回结果我们可以看出 列表拼接后并没有改变其内部结构 而是简单的堆积到一起 成为一个递归型列表
如果需要“扁平化”列表 则需要指定list()的recursive参数
exp: c(list(a=1,b=2,c=list(d=5,e=8))),recursive=T) #recursive为TURE时将列表扁平化 得到一个向量(列表)
输出:
a b c.d c.e
1 2 5 9