學習R記錄 <- 基礎4(列表與資料框)
列表與資料框
到目前為止,向量、陣列、矩陣這些前面提到的所包含的元素型別都是相同的,而列表 和資料框 允許把不同的資料型別合併到單一變數中。
1.列表
1.1 建立列表
建立列表使用list函式,列表中的元素型別不限,可以是向量、矩陣,甚至還可以是函式。
> a <- list( +c(1,2,3,4,5), +month.abb, +matrix(c(3, -8, 1, -3), nrow = 2), +asin + ) > a [[1]] [1] 1 2 3 4 5 [[2]] [1] "Jan" "Feb" "Mar" "Apr" "May" "Jun" "Jul" "Aug" "Sep" "Oct" "Nov" "Dec" [[3]] [,1] [,2] [1,]31 [2,]-8-3 [[4]] function (x).Primitive("asin")
同樣的,你也可以給列表命名。
> names(a) <- c('catalan', 'months', 'involutary', 'arcsin') > a $catalan [1] 1 2 3 4 5 $months [1] "Jan" "Feb" "Mar" "Apr" "May" "Jun" "Jul" "Aug" "Sep" "Oct" "Nov" "Dec" $involutary [,1] [,2] [1,]31 [2,]-8-3 $arcsin function (x).Primitive("asin")
同樣你也可以把此列表當作另一個列表的元素。
1.2 原子變數和遞迴變數
這裡有一個概念:因為列表有把其他列表包含在內的能力,所以被稱為 遞迴變數 , 與之相對的向量、矩陣、陣列被稱為 原子變數 。
1.3 索引列表
我們可以使用[]、正負下標數或者元素名稱,邏輯索引來訪問列表元素,
值得注意的是,索引操作的結果產生了另一個列表 , 所以當你要訪問列表元素的內容,需要使用[[]]雙方括號
> a [[1]] [1] 1 2 3 4 5 [[2]] [1]6789 10 [[3]] [1] "dsa" > a[1] [[1]] [1] 1 2 3 4 5 > a[[1]] [1] 1 2 3 4 5
使用函式is.list會更直觀:
> a[[1]] [1] 1 2 3 4 5 > is.list(a) [1] TRUE > is.list(a[1]) [1] TRUE > is.list(a[[1]]) [1] FALSE
當然對於已經命名的元素可以使用$來訪問其值。這就有點類似於shell了。
1.4 向量與列表的轉換
> b <- c(1,2,3,4) > c <- as.list(b) > b [1] 1 2 3 4 > c [[1]] [1] 1 [[2]] [1] 2 [[3]] [1] 3 [[4]] [1] 4 > is.list(c) [1] TRUE
如上,使用函式as.list可以完成轉化。
當然列表也可以轉化成向量
- 當列表中元素都是標量時,使用函式as.numeric等可以將列表轉換為不同型別的向量。
- 當列表中的元素包含非標量, 那這就是一個問題了,可以先使用函式unlist將其轉化為向量
1.5NULL值
NULL值是一個特殊值,它表示的是一個空的變數,有時候你建立一個列表時,有的元素必須存在但是目前還沒有賦值,就可以用NULL來表示。
需要區分的是NULL和NA它們有很大區別,其中一個區別就是NULL的長度為0——NULL不會佔用任何空間;而NA是一個標量,長度為1
> length(NULL) [1] 0 > length(NA) [1] 1
2. 資料框
資料框十分常見,它就類似於一個電子表格。
2.1 建立資料框
使用函式data.frame 可以建立資料框:
> c <- data.frame(x = c(1:5), y = rnorm(5), z = runif(5) > 0.5) > c xyz 1 1 -0.8818198TRUE 2 21.1158819TRUE 3 30.4585993TRUE 4 40.8917424 FALSE 5 50.7377649TRUE
在資料框中每一列的資料型別必須相同,但是列與列之間型別可以不同。
每一行的名字可以使用引數row.names來命名
> row.names(c) <- c('A', 'B', 'C', 'D', 'E') > c xyz A 1 -1.00220443 FALSE B 2 -0.81289684TRUE C 3 -0.79172877 FALSE D 40.19666573TRUE E 5 -0.04511619 FALSE
其實幾乎所有的矩陣的函式都可以用在資料框上
> rownames(c) [1] "A" "B" "C" "D" "E" > colnames(c) [1] "x" "y" "z" > dimnames(c) [[1]] [1] "A" "B" "C" "D" "E" [[2]] [1] "x" "y" "z" > nrow(c) [1] 5 > ncol(c) [1] 3 > dim(c) [1] 5 3 > length(c) [1] 3 > names(c) [1] "x" "y" "z"
有點不同的是函式length返回和函式ncol一樣的值即列數,names函式返回的也是列名。