R中的列表(list)和數據框(data.frame)有什麼區別?
list 是一種一般的數據結構,而 data.frame 是一種特殊的 list。list 的每個分量可以在長度、類型上完全不一樣,就像一組指針指向了一堆不同的變數。那如果想要在一個分量里包含不同類型、長度的變數怎麼辦?沒有問題,list還可以嵌套,只要定義第一層 list 的某個分量為另一個 list,就能繼續包含不同類型、長度的變數了。所以基本上可以說沒有任何限制。
顯然 list 並不是數據分析時常用的數據結構,數據分析常見的都是矩陣或二維表。所以 data.frame 是在 list 上加了如下限制[^1]:
在數據框中以變數形式出現的向量結構必須長度一致,矩陣結構必須有一樣的行數;
我覺得這就是數據框最本質的要求了:向量一樣長。
分量必須是向量(數值, 字元, 邏輯),因子,數值矩陣,列表或者其他數據框;
注意這裡有奇怪的東西:矩陣 matrix、列表 list 和 數據框 data.frame。這幾個好像都不是向量,為什麼能放進數據框里?
數值向量、邏輯值、因子保持原有格式,而字元向量會被強制轉換成因子並且它的水平就是向量中出現的獨立值;
上述的幾個分量的類型中,這幾類都是向量,可以被直接加入數據框(作為列),但需要長度一樣。如果不一樣,不過長的向量長度是短的向量的倍數也可以,短的會被重複後加入。如果不一樣也不是倍數則不能加入,會給出warning。
&> data.frame(1:6, 1:3)
X1.6 X1.3
1 1 1
2 2 2
3 3 3
4 4 1
5 5 2
6 6 3
&> data.frame(1:5, 1:3)
Error in data.frame(1:5, 1:3) :
arguments imply differing number of rows: 5, 3
矩陣、列表和數據框為新的數據框提供了儘可能多的變數,因為它們各自擁有列、元素或者變數。
這就是靈活的地方了,這些不是向量的也能加,但是加入的時候會先把他們拆成相應的向量,然後一個個加。在一個個加的時候,依照上面的規則,核心還是只能加入一樣長的向量。
&> data.frame(1:6, data.frame(1:6, 7:12))
X1.6 X1.6.1 X7.12
1 1 1 7
2 2 2 8
3 3 3 9
4 4 4 10
5 5 5 11
6 6 6 12
&> data.frame(1:6, matrix(1:12, ncol=2))
X1.6 X1 X2
1 1 1 7
2 2 2 8
3 3 3 9
4 4 4 10
5 5 5 11
6 6 6 12
&> data.frame(1:6, matrix(1:12, nrow=2))
X1.6 X1 X2 X3 X4 X5 X6
1 1 1 3 5 7 9 11
2 2 2 4 6 8 10 12
3 3 1 3 5 7 9 11
4 4 2 4 6 8 10 12
5 5 1 3 5 7 9 11
6 6 2 4 6 8 10 12
&> list(1:6, 7:12)
[[1]]
[1] 1 2 3 4 5 6[[2]]
[1] 7 8 9 10 11 12&> data.frame(1:6, list(1:6, 7:12))
X1.6 X1.6.1 X7.12
1 1 1 7
2 2 2 8
3 3 3 9
4 4 4 10
5 5 5 11
6 6 6 12
R 導論,中文版本 0.1 (2006-06-15)?
list是個筐,什麼都可以往裡裝,包括它自身。數據框是個二維數組,同列必須同類型,行隨意。
推薦閱讀:
※用R可以做數據清洗嗎?或者有更好的數據清洗工具?
※R語言里做時間序列分析有哪些包?
※Microsoft R open和Microsoft R server和普通的R語言有什麼區別和聯繫?
TAG:R編程語言 |