1. 程式人生 > >R語言學習 第七篇:列表

R語言學習 第七篇:列表

方法 靈活的數據類型 引號 bounds 參考 最大的 post 長度 索引操作

列表(List)是R中最復雜的數據類型,一般來說,列表是數據對象的有序集合,但是,列表的各個元素(item)的數據類型可以不同,每個元素的長度可以不同,是R中最靈活的數據類型。列表項可以是列表類型,因此,列表被認為是遞歸變量,與之相對,向量,數組,矩陣,數據框被認為是原子變量。

一,創建列表

列表由list()函數創建,每個參數使用逗號分割,用於指定列表項的內容,列表中的元素數量不限,類型不限。列表項的名稱是可選的,可以創建無名的列表項;列表的每一個item,都可以顯示命名,例如,name1=item1, name2=item2。

list([name1=]item1,[name2=]item2,...)

1,創建的無名的列表項

例如,下面的腳本創建一個列表,該列表共有三個item,第一個item是整數向量,第二個item是字符向量,第三個item是矩陣,列表的每一個item都沒有名稱:

> 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

四,索引列表

可以使用中括號索引列表的元素,下標有四種表示方法:正整數,負整數,元素名稱或邏輯索引,例如,a_list[1:2], a_list[-3], a_list[c(‘first‘,‘second‘)], a_list[c(TURE,TRUE,FALSE)] 這四種方法返回的結果相同:

> a_list[1:2]
$first
[1] 1 2 3

$second
 [1] "Jan" "Feb" "Mar" "Apr" "May" "Jun" "Jul" "Aug" "Sep" "Oct" "Nov" "Dec"

這些索引操作的結果是另一個列表,這意味著,使用單個中括號,返回的是一個新的列表,要訪問列表元素的內容,有兩種方式:使用嵌套的中括號(傳入正整數,代表列表項的下標,或傳入字符串,代表列表項的名稱),或指定元素的名稱

例如,通過嵌套的中括號和下標,獲取列表的第一個項目(item)的值:

> a_list[[1]]
[1] 1 2 3

例如,通過指定元素的名稱作為下標,獲取列表的第一個項目(item)的值:

> a_list$first
[1] 1 2 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值和NA值

NULL是個特殊值,表示未知值,NA表示缺失值,NULL和NA之間最大的區別是:NA是一個標量值,長度為1,而NULL不會占用任何空間,長度為零:

> length(NA)
[1] 1
> length(NULL)
[1] 0

使用is.null函數驗證NULL值,使用is.na函數驗證NA值:

> is.null(NULL)
[1] TRUE
> is.na(NA)
[1] TRUE

六,列表項的追加、刪除和更新

列表創建之後,可以向列表中追加元素,也可以刪除現有的列表元素

1,刪除列表元素

NULL能夠用於刪除列表中的元素,把列表項設置為NULL,則會刪除該列表項,在該列表項之後的元素,其索引都要減少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
$second
 [1] "Jan" "Feb" "Mar" "Apr" "May" "Jun" "Jul" "Aug" "Sep" "Oct" "Nov" "Dec"

$third
     [,1] [,2]
[1,]   -1   -3
[2,]   -2   -4

[[3]]
[1] 1 2 3

$fifth
[1] "a" "b"

3,列表項的更新

更新列表項,這可以通過直接訪問列表項,把列表項賦值為新的變量的值來實現,例如,把列表的第三個列表項修改為list變量:

> a_list[[3]]=list(‘L1‘,‘L2‘)
> a_list[[3]]
[[1]]
[1] "L1"

[[2]]
[1] "L2"

七,列表和向量的相互轉換

向量可以使用函數as.list函數轉換成列表,所創建的列表和向量中的元素一一對應:

> v=c(1,3)
> (l=as.list(v))
[[1]]
[1] 1

[[2]]
[1] 3

列表既能存儲相同的類型的數據,也能存儲不同類型的數據,如果列表的所有列表項的數據類型相同,可以通過unlist函數把列表轉換成向量:

> unlist(l)
[1] 1 3

參考文檔:

R--列表

R語言學習 第七篇:列表