Data Frames

R 的 data frame 是一個用來儲存類似 Excel 表格的變數類型,它跟矩陣類似,不過 data frame 的每個行(column)可以儲存不同變數類型的資料,甚至非狀巢結構的列表亦可。

建立 Data Frames

我們可以使用 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