列表,组合多个不同类型的对象
#列表属于递归型的向量
j <- list(name="joe",salary=55000,union=T)
#name,salary称为标签,标签的名字可以简写
j$sal
#列表也是向量所以可以通过vector()来创建列表
z <- vector(mode = "list")
#使用列表中的标签名来作为索引
z[["abc"]] <- 3```
#列表索引
三种方法,但是注意是双重中括号
j[[2]]
j[["salary"]]
j$salary
单个中括号返回的是一个新的列表
j[1]
双重中括号提取列表的一个组件,返回的是组件的本身类型```
增加,删除列表元素
z$c <- "sailing"
#利用索引添加组件
z[[3]] <- 28
#添加序列就要使用单括号
z[4:5] <- c(T,F)
#删除元素,将值设为NULL
z$abc <- NULL
#后面的元素索引会减1```
#合并多个列表
c(list("joe",55000,T),list(6))```
获取列表长度,是获取到列表的组件个数
length(j)```
#一个统计单词数的函数
findwords <- function(tf){
read in the words from the file,into a vector of mode character
txt <- scan(tf,what="")
wl <- list()
读入每个单词作为txt的一个向量元素
for(i in 1:length(txt)){
wrd <- tolower(txt[i])
wl[[wrd]] <- c(wl[[wrd]],i)
}
return(wl)
}```
访问列表组件标签的值
names(j)
#unlist()获取列表的值
ulj <- unlist(j)
#unlist返回的是一个向量,向量类型根据第一个标签来确定
#比如name是numeric,则返回的向量就是numeric
#如果是混合类型,有numeric有character返回的就是character
#所以通常是字符串向量
w <- list(a=5,b="xyz")
wu <- unlist(w)
class(wu)
wu
#把元素名设为null
names(wu) <- NULL
wu
#或者去掉元素名
wun <- unname(wu)
wun```
#apply系列函数
lapply代表list apply对列表的每个组件执行给定的函数
第二个参数是函数名,不需要加括号
返回的是一个使用函数处理过的列表
lapply(list(1:3,25:29),median)
sapply表示simplified apply,可以简化返回的值为向量或者矩阵
返回一个中位数的向量
sapply(list(1:3,25:29),median)```
文本词汇索引
#sort wrdlst,the output of findwords() alphabetically by word
alphawl <- function(wrdlst){
#将列表名称获得
nms <- names(wrdlst)
#对名称排序,返回排序后的索引
sn <- sort(nms)
#返回排序后的列表,但是只有这样索引才能有序
#wrdlst结构并没有变化
return(wrdlst[sn])
}
#orders the output of findwords() by word frequency
freqwl <- function(wrdlst){
#使用sapply获取到list的每一个组件的length
freqs <- sapply(wrdlst,length)
return(wrdlst[order(freqs)])
}
#order()函数
x <- c(12,5,13,8)
order(x)
#返回的是排完序后的索引,
#因此使用wrdlst[order(freqs)]就可以获得排序的列表```
#一个实例
nyt <- findwords("nyt.txt")
进行频率排序,但是列表每个组件还是存储着所在的单词数
snyt <- freqwl(nyt)
总共有多少个单词
nwords <- length(snyt)
对频率在前10%的单词,将其出现的次数提取出来
freqwls <- sapply(snyt[round(0.96*nwords):nwords],length)
win.graph(width=4.875, height=2.5,pointsize=8)
barplot(freqwls)```
lapply()的一个用法
g <- c("M","F","F","M","I","M")
#which()函数give the true indices of a logical object,
#allowing for array indices
lapply(c("M","F","I"),function(gender) which(g==gender))
#这里第一个参数是向量,lapply()会将向量强制转换成列表的形式
#首先在"M"上调用匿名函数,其次"F","I",which()函数返回索引向量
#向量g不在第一个参数而在which()里面```
#递归型列表
b <- list(u=5,v=12)
c <- list(w = 13)
a <- list(b,c)
a
即表示列表的组件也可以是列表
拼接函数c()有一个参数recursive表示将源列表压平
c(b,c,a)
c(b,c,a,recursive=T)