建立一個空的 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