列表,組合多個(gè)不同類型的對(duì)象
#列表屬于遞歸型的向量
j <- list(name="joe",salary=55000,union=T)
#name,salary稱為標(biāo)簽,標(biāo)簽的名字可以簡(jiǎn)寫
j$sal
#列表也是向量所以可以通過(guò)vector()來(lái)創(chuàng)建列表
z <- vector(mode = "list")
#使用列表中的標(biāo)簽名來(lái)作為索引
z[["abc"]] <- 3```
#列表索引
三種方法,但是注意是雙重中括號(hào)
j[[2]]
j[["salary"]]
j$salary
單個(gè)中括號(hào)返回的是一個(gè)新的列表
j[1]
雙重中括號(hào)提取列表的一個(gè)組件,返回的是組件的本身類型```
增加,刪除列表元素
z$c <- "sailing"
#利用索引添加組件
z[[3]] <- 28
#添加序列就要使用單括號(hào)
z[4:5] <- c(T,F)
#刪除元素,將值設(shè)為NULL
z$abc <- NULL
#后面的元素索引會(huì)減1```
#合并多個(gè)列表
c(list("joe",55000,T),list(6))```
獲取列表長(zhǎng)度,是獲取到列表的組件個(gè)數(shù)
length(j)```
#一個(gè)統(tǒng)計(jì)單詞數(shù)的函數(shù)
findwords <- function(tf){
read in the words from the file,into a vector of mode character
txt <- scan(tf,what="")
wl <- list()
讀入每個(gè)單詞作為txt的一個(gè)向量元素
for(i in 1:length(txt)){
wrd <- tolower(txt[i])
wl[[wrd]] <- c(wl[[wrd]],i)
}
return(wl)
}```
訪問(wèn)列表組件標(biāo)簽的值
names(j)
#unlist()獲取列表的值
ulj <- unlist(j)
#unlist返回的是一個(gè)向量,向量類型根據(jù)第一個(gè)標(biāo)簽來(lái)確定
#比如name是numeric,則返回的向量就是numeric
#如果是混合類型,有numeric有character返回的就是character
#所以通常是字符串向量
w <- list(a=5,b="xyz")
wu <- unlist(w)
class(wu)
wu
#把元素名設(shè)為null
names(wu) <- NULL
wu
#或者去掉元素名
wun <- unname(wu)
wun```
#apply系列函數(shù)
lapply代表list apply對(duì)列表的每個(gè)組件執(zhí)行給定的函數(shù)
第二個(gè)參數(shù)是函數(shù)名,不需要加括號(hào)
返回的是一個(gè)使用函數(shù)處理過(guò)的列表
lapply(list(1:3,25:29),median)
sapply表示simplified apply,可以簡(jiǎn)化返回的值為向量或者矩陣
返回一個(gè)中位數(shù)的向量
sapply(list(1:3,25:29),median)```
文本詞匯索引
#sort wrdlst,the output of findwords() alphabetically by word
alphawl <- function(wrdlst){
#將列表名稱獲得
nms <- names(wrdlst)
#對(duì)名稱排序,返回排序后的索引
sn <- sort(nms)
#返回排序后的列表,但是只有這樣索引才能有序
#wrdlst結(jié)構(gòu)并沒(méi)有變化
return(wrdlst[sn])
}
#orders the output of findwords() by word frequency
freqwl <- function(wrdlst){
#使用sapply獲取到list的每一個(gè)組件的length
freqs <- sapply(wrdlst,length)
return(wrdlst[order(freqs)])
}
#order()函數(shù)
x <- c(12,5,13,8)
order(x)
#返回的是排完序后的索引,
#因此使用wrdlst[order(freqs)]就可以獲得排序的列表```
#一個(gè)實(shí)例
nyt <- findwords("nyt.txt")
進(jìn)行頻率排序,但是列表每個(gè)組件還是存儲(chǔ)著所在的單詞數(shù)
snyt <- freqwl(nyt)
總共有多少個(gè)單詞
nwords <- length(snyt)
對(duì)頻率在前10%的單詞,將其出現(xiàn)的次數(shù)提取出來(lái)
freqwls <- sapply(snyt[round(0.96*nwords):nwords],length)
win.graph(width=4.875, height=2.5,pointsize=8)
barplot(freqwls)```
單詞出現(xiàn)頻次統(tǒng)計(jì)圖
lapply()的一個(gè)用法
g <- c("M","F","F","M","I","M")
#which()函數(shù)give the true indices of a logical object,
#allowing for array indices
lapply(c("M","F","I"),function(gender) which(g==gender))
#這里第一個(gè)參數(shù)是向量,lapply()會(huì)將向量強(qiáng)制轉(zhuǎn)換成列表的形式
#首先在"M"上調(diào)用匿名函數(shù),其次"F","I",which()函數(shù)返回索引向量
#向量g不在第一個(gè)參數(shù)而在which()里面```
#遞歸型列表
b <- list(u=5,v=12)
c <- list(w = 13)
a <- list(b,c)
a
即表示列表的組件也可以是列表
拼接函數(shù)c()有一個(gè)參數(shù)recursive表示將源列表壓平
c(b,c,a)
c(b,c,a,recursive=T)