R 的 data frame 是一個用來儲存類似 Excel 表格的變數類型,它跟矩陣類似,不過 data frame 的每個行(column)可以儲存不同變數類型的資料,甚至非狀巢結構的列表亦可。
我們可以使用 data.frame
函數來建立 data frame 變數:
x.data.frame <- data.frame( x = letters[1:6], y = rnorm(6), z = runif(6) > 0.5 ) x.data.frame
x y z 1 a -2.055503994 TRUE 2 b 0.114532213 FALSE 3 c -0.622876848 TRUE 4 d -1.207309249 TRUE 5 e -0.004488973 FALSE 6 f -0.549760562 FALSE
class(x.data.frame)
[1] "data.frame"
雖然一個 data frame 中每行(column)的資料類型可以是不同的,但是在同一行裡面的資料一定要是相同的資料類型。
上面產生的這個 data frame 中,並沒有明確指定每一列的名稱,這時候 R 會自動將每一列從 1
開始編號,作為預設的名稱。
在建立 data frame 時,如果任何一個向量有被指定每個元素的名稱時,R 會依據第一個這樣具有名稱的向量,為 data frame 的列命名。
y <- rnorm(5) names(y) <- month.name[1:5] data.frame( x = letters[1:5], y = y, z = runif(5) > 0.5 )
x y z January a 1.0538679 TRUE February b -0.6289093 TRUE March c -0.2401373 TRUE April d -1.3266327 FALSE May e -1.1100246 FALSE
如果不想要讓 R 自動依照向量的元素名稱來指定 data frame 列名稱,可以將 row.names
指定為 NULL
:
data.frame( x = letters[1:5], y = y, z = runif(5) > 0.5, row.names = NULL )
x y z 1 a 1.0538679 FALSE 2 b -0.6289093 TRUE 3 c -0.2401373 TRUE 4 d -1.3266327 FALSE 5 e -1.1100246 FALSE
我們也可以利用 row.names
參數明確指定 data frame 的列名稱:
data.frame( x = letters[1:5], y = y, z = runif(5) > 0.5, row.names = c("Taipei", "Hsinchu", "Taichung", "Tainan", "Kaohsiung") )
x y z Taipei a 1.0538679 TRUE Hsinchu b -0.6289093 FALSE Taichung c -0.2401373 FALSE Tainan d -1.3266327 FALSE Kaohsiung e -1.1100246 TRUE
列名稱也可以在 data frame 建立之後,再使用 rownames
函數來指定或是取得,另外其行(column)名稱則可使用 colnames
函數,或是使用 dimnames
一次存取所有的行與列的名稱。
rownames(x.data.frame)
[1] "1" "2" "3" "4" "5" "6"
colnames(x.data.frame)
[1] "x" "y" "z"
dimnames(x.data.frame)
[[1]] [1] "1" "2" "3" "4" "5" "6" [[2]] [1] "x" "y" "z"
大部分適用於矩陣的函數,都可以直接套用至 data frame 上使用:
nrow(x.data.frame)
[1] 6
ncol(x.data.frame)
[1] 3
dim(x.data.frame)
[1] 6 3
若使用 length
函數檢查 data frame 的話,會傳回跟 ncol
函數一樣的值,不是所有 data frame 的元素個數,而 names
作用在 data frame 上則跟 colnames
一樣。
length(x.data.frame)
[1] 3
names(x.data.frame)
[1] "x" "y" "z"
在建立 data frame 時可以允許使用不同長度的向量,R 會自動將較短的向量重複使用:
data.frame( x = c("One", "Two"), y = 1:3, z = rnorm(6) )
x y z 1 One 1 -0.6910683 2 Two 2 0.7902759 3 One 3 -1.8949503 4 Two 1 0.4802724 5 One 2 0.8673821 6 Two 3 -0.8795439
如果有些較短的向量其長度不是最長向量長度的整數倍,就會產生錯誤:
data.frame( x = c("One", "Two"), y = 1:3, z = rnorm(5) )
Error in data.frame(x = c("One", "Two"), y = 1:3, z = rnorm(5)) : arguments imply differing number of rows: 2, 3, 5