R語(yǔ)言中的數(shù)組和列表

R語(yǔ)言中的數(shù)組與其它語(yǔ)言數(shù)組類似,它是一種高維的數(shù)據(jù)結(jié)構(gòu)。維數(shù)過(guò)高運(yùn)算會(huì)很不方便,所以用的很少,這里介紹是本著不落下任何知識(shí)點(diǎn)的目的。萬(wàn)一以后遇到了,雖然不方便,還是可以進(jìn)行運(yùn)算的。當(dāng)然了,矩陣是二維數(shù)組,是數(shù)組的一種特殊形式。R中的列表是一種特殊的數(shù)組,每個(gè)元素又可以是一個(gè)列表可以含有多個(gè)元素,里面可以包含各種數(shù)據(jù)類型,故功能非常強(qiáng)大。

數(shù)組
數(shù)組有一個(gè)維數(shù)向量,可以定義數(shù)組的維數(shù),通過(guò)array()進(jìn)行創(chuàng)建數(shù)組如下:

> arr <- array(c(1:24),dim = c(2,3,4))
> dim(arr)
[1] 2 3 4
> arr
, , 1
     [,1] [,2] [,3]
[1,]    1    3    5
[2,]    2    4    6
, , 2
     [,1] [,2] [,3]
[1,]    7    9   11
[2,]    8   10   12
, , 3
     [,1] [,2] [,3]
[1,]   13   15   17
[2,]   14   16   18
, , 4
     [,1] [,2] [,3]
[1,]   19   21   23
[2,]   20   22   24
> class(arr)
[1] "array"

以上創(chuàng)建語(yǔ)句,第一個(gè)參數(shù)表示用1:24作為數(shù)組的數(shù)據(jù),dim = c(2,3,4)表示數(shù)組維數(shù)為2x3x4。
我們也可以用下面這種方式定義數(shù)組:

> arr1 <- c(1:24)
> dim(arr1) <- c(2,3,4)
> arr1
, , 1
     [,1] [,2] [,3]
[1,]    1    3    5
[2,]    2    4    6
, , 2
     [,1] [,2] [,3]
[1,]    7    9   11
[2,]    8   10   12
, , 3
     [,1] [,2] [,3]
[1,]   13   15   17
[2,]   14   16   18
, , 4
     [,1] [,2] [,3]
[1,]   19   21   23
[2,]   20   22   24

> class(arr1)
[1] "array"

這種方式就是先指定向量c(1:24)為數(shù)組的數(shù)據(jù),再指定其維數(shù)為2x3x4,最后其類型仍然為"array"。

矩陣的取塊,其實(shí)與上節(jié)講的矩陣取值一樣。比如:

> arr[1,,]
     [,1] [,2] [,3] [,4]
[1,]    1    7   13   19
[2,]    3    9   15   21
[3,]    5   11   17   23

我們可以將數(shù)組轉(zhuǎn)化為矩陣,比如我們嘗試將arr這個(gè)數(shù)組轉(zhuǎn)化為矩陣:

a <- as.matrix(arr)

猜測(cè)一下,a會(huì)長(zhǎng)什么樣?我們看一下,哈哈!

> a
      [,1]
 [1,]    1
 [2,]    2
 [3,]    3
 [4,]    4
 [5,]    5
 [6,]    6
 [7,]    7
 [8,]    8
 [9,]    9
[10,]   10
[11,]   11
[12,]   12
[13,]   13
[14,]   14
[15,]   15
[16,]   16
[17,]   17
[18,]   18
[19,]   19
[20,]   20
[21,]   21
[22,]   22
[23,]   23
[24,]   24
> dim(a)
[1] 24  1

竟然是一個(gè)24x1的矩陣,沒(méi)想到吧。

列表
R中用list()創(chuàng)建列表,比如

> li <- list(c(1:3),c('a','b'),c(4:6))
> li
[[1]]
[1] 1 2 3
[[2]]
[1] "a" "b"
[[3]]
[1] 4 5 6

這個(gè)列表包含三個(gè)元素,分別是c(1:3),c('a','b'),c(4:6),而每個(gè)元素又是一個(gè)數(shù)據(jù)集合,我現(xiàn)在要取第一個(gè)元素的第三個(gè)元素(就是3)

> li[[1]][1]
[1] 1

取第一個(gè)元素,就是

> li[1]
[[1]]
[1] 1 2 3

列表的每個(gè)元素還是列表,同樣說(shuō)明列表可以嵌套。具體定位到最里層元素就是相應(yīng)數(shù)據(jù)類型了:

> class(li[[1]][1])
[1] "integer"
> li[[2]][1]
[1] "a"
> class(li[[2]][1])
[1] "character"

我們可以給列表每個(gè)元素取一個(gè)名字

> names(li) <- c('a1','a2','a3')
> li
a1[1]123a1
[1] 1 2 3a2
[1] "a" "b"
$a3
[1] 4 5 6

為什么取名字呢,這樣我們引用時(shí)可以直接利用美元符號(hào)“$”+名字‘a(chǎn)1’,’a2‘,‘a(chǎn)3’,而不需要寫[[1]]那么麻煩了。

> lia1[1]123>lia1
[1] 1 2 3
> lia2[1]
[1] "a"

其實(shí),給列表起名字還有更方便之處,這才是最終目的:可以在綁定數(shù)據(jù)后,直接引用列表元素名即可。
綁定列表用attach()

> attach(li)

然后,就可以直接引用列表元素名了。

> a1
[1] 1 2 3
> a2[2]
[1] "b"

關(guān)于R語(yǔ)言中的數(shù)組和列表(主要是列表)用法很靈活多樣,在以后我們會(huì)有實(shí)戰(zhàn)應(yīng)用會(huì)用到。





作者:柯廣的網(wǎng)絡(luò)日志

微信公眾號(hào):Java大數(shù)據(jù)與數(shù)據(jù)倉(cāng)庫(kù)