建立一個空的 data.frame
data.frame 是一種特殊的列表:它是矩形的。列表的每個元素(列)具有相同的長度,並且每行具有行名稱。每列都有自己的類,但是一列的類可以與另一列的類不同(與矩陣不同,其中所有元素必須具有相同的類)。
原則上,data.frame 可以沒有行也沒有列:
> structure(list(character()), class = "data.frame")
NULL
<0 rows> (or 0-length row.names)
但這很不尋常。data.frame 更常見的是有很多列和很多行。這是一個包含三行和兩列的 data.frame(a
是數字類,b
是字元類):
> structure(list(a = 1:3, b = letters[1:3]), class = "data.frame")
[1] a b
<0 rows> (or 0-length row.names)
為了列印 data.frame,我們需要提供一些行名稱。這裡我們只使用數字 1:3:
> structure(list(a = 1:3, b = letters[1:3]), class = "data.frame", row.names = 1:3)
a b
1 1 a
2 2 b
3 3 c
現在很明顯,我們有一個包含 3 行和 2 列的 data.frame。你可以使用 nrow()
,ncol()
和 dim()
來檢查:
> x <- structure(list(a = numeric(3), b = character(3)), class = "data.frame", row.names = 1:3)
> nrow(x)
[1] 3
> ncol(x)
[1] 2
> dim(x)
[1] 3 2
R 提供了另外兩個可用於建立 data.frame 的函式(除了 structure()
)。第一個是直觀地稱為 data.frame()
。它會檢查以確保你提供的列名有效,列表元素的長度都相同,並提供一些自動生成的行名。這意味著 data.frame()
的輸出現在可能總是完全符合你的預期:
> str(data.frame("a a a" = numeric(3), "b-b-b" = character(3)))
'data.frame': 3 obs. of 2 variables:
$ a.a.a: num 0 0 0
$ b.b.b: Factor w/ 1 level "": 1 1 1
另一個函式叫做 as.data.frame()
。這可以用於通過 data.frame()
執行將不是 data.frame 的物件強制為 data.frame。例如,考慮一個矩陣:
> m <- matrix(letters[1:9], nrow = 3)
> m
[,1] [,2] [,3]
[1,] "a" "d" "g"
[2,] "b" "e" "h"
[3,] "c" "f" "i"
結果如下:
> as.data.frame(m)
V1 V2 V3
1 a d g
2 b e h
3 c f i
> str(as.data.frame(m))
'data.frame': 3 obs. of 3 variables:
$ V1: Factor w/ 3 levels "a","b","c": 1 2 3
$ V2: Factor w/ 3 levels "d","e","f": 1 2 3
$ V3: Factor w/ 3 levels "g","h","i": 1 2 3