列表(List)是R中最復雜的數據類型,一般來說,列表是數據對象的有序集合,但是,列表的各個元素(item)的數據類型可以不同,每個元素的長度可以不同,是R中最靈活的數據類型。列表項可以是列表類型,因此,列表被認為是遞歸變量,與之相對,向量,數組,矩陣,數據框被認為是原子變量。
一,創建列表
列表由list()函數創建,每個參數使用逗號分割,用於指定列表項的內容,列表中的元素數量不限,類型不限。列表項的名稱是可選的,可以創建無名的列表項;列表的每一個item,都可以顯示命名,例如,name1=item1, name2=item2。
list([name1=]item1,[name2=]item2,...)
1,創建的無名的列表項
例如,下面的腳本創建一個列表,該列表共有三個item,第一個item是整數向量,第二個item是字符向量,第三個item是矩陣,列表的每一個item都沒有名稱;對於無名的列表項,只能通過嵌套的中括號[[n]]來索引列表項的元素:
> 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
四,索引列表
列表的下標是列表項的序號,可以使用中括號[n]索引列表的元素,下標有四種表示方法:正整數、負整數、元素名稱或邏輯索引,下標的整數值從1開始,正整數表示選擇該列表項,負整數表示剔除該列表項。
例如,選擇列表的第1項,第2項,分別使用正整數下標、負整數下標、元素名稱和邏輯索引表示:
> a_list[1:2] > a_list[-3] > a_list[c('first','second')] > a_list[c(TURE,TRUE,FALSE)] $first [1] 1 2 3 $second [1] "Jan" "Feb" "Mar" "Apr" "May" "Jun" "Jul" "Aug" "Sep" "Oct" "Nov" "Dec"
這些索引操作的結果是產生另一個列表,也就是說,使用單個中括號索引列表項,返回的結果是一個新的列表,要訪問列表元素的內容,有兩種方式:使用嵌套的中括號(傳入正整數,代表列表項的下標,或傳入字符串,代表列表項的名稱),或指定元素的名稱。
1,使用嵌套的中括號
例如,通過嵌套的中括號和下標,獲取列表的第一個項目(item)的值:
> a_list[[1]]
[1] 1 2 3
2,使用列表的名稱
例如,通過指定元素的名稱作為下標,獲取列表的第一個項目(item)的值:
> a_list$first
[1] 1 2 3
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值。
1,刪除列表元素
NULL是各特殊值,表示一個空的變量,不會占用任何空間,長度為零。NULL能夠用於刪除列表中的元素,把列表項更新為NULL,則R會刪除該列表項,在該列表項之后的元素,其索引序號都要減少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[3] <- list(c(1:3)) > a_list["fifth"] <- list(c('a','b'))
3,列表項的更新
更新列表項,可以通過直接訪問列表項,把列表項賦值為新的變量來實現,
例如,把列表的第三個列表項修改為list類型的變量:
> a_list["forth"] <- list(c('L1','L2')) > a_list$"forth" [1] "L1" "L2"
4,更新列表項的元素
索引列表項的元素,改變元素的值:
> a_list$"forth"[3] <- "L3" > a_list$forth [1] "L1" "L2" "L3"
5,把列表項更新為NULL值
要把現有的列表元素設置為NULL值,不能簡單地為其賦值為NULL,因為這將刪除該列表元素,而是必須使用list(NULL)來設置,list(NULL)返回的是空的列表:
a_list[1] <- list(NULL)
六,列表和向量的相互轉換
向量可以使用函數as.list函數轉換成列表,所創建的列表和向量中的元素一一對應,列表的每一個元素都對應向量的每一個元素:
> v=c(1,3)
> (l=as.list(v)) [[1]] [1] 1 [[2]] [1] 3
列表既能存儲相同的類型的數據,也能存儲不同類型的數據,如果列表的所有列表項的數據類型相同,並且每一個列表項都是標量變量,可以通過unlist()函數把列表轉換成向量:
> unlist(l)
[1] 1 3
如果列表存儲不同類型的數據,那么列表不能轉換為向量。
參考文檔: