數(shù)據(jù)框是S中類似SAS數(shù)據(jù)集的一種數(shù)據(jù)結(jié)構(gòu)。它通常是矩陣形式的數(shù)據(jù),但矩陣各列可以是不同類型的。數(shù)據(jù)框每列是一個變量,每行是一個觀測。
但是,數(shù)據(jù)框有更一般的定義。它是一種特殊的列表對象,有一個值為“data.frame”的class 屬性,各列表成員必須是向量(數(shù)值型、字符型、邏輯型)、因子、數(shù)值型矩陣、列表,或其它數(shù)據(jù)框。向量、因子成員為數(shù)據(jù)框提供一個變量,如果向量非數(shù)值型則會被強制轉(zhuǎn)換為因子,而矩陣、列表、數(shù)據(jù)框這樣的成員為新數(shù)據(jù)框提供了和其列數(shù)、成員數(shù)、變量數(shù)相同個數(shù)的變量。作為數(shù)據(jù)框變量的向量、因子或矩陣必須具有相同的長度(行數(shù))。
盡管如此,我們一般還是可以把數(shù)據(jù)框看作是一種推廣了的矩陣,它可以用矩陣形式顯示,可以用對矩陣的下標引用方法來引用其元素或子集。
數(shù)據(jù)框可以用data.frame()函數(shù)生成,其用法與list()函數(shù)相同,各自變量變成數(shù)據(jù)框的成分,自變量可以命名,成為變量名。例如:
> d <- data.frame(name=c("李明", "張聰", "王建"), age=c(30, 35, 28),+ height=c(180, 162, 175))> d name age height1 李明 30 1802 張聰 35 1623 王建 28 175
如果一個列表的各個成分滿足數(shù)據(jù)框成分的要求,它可以用as.data.frame()函數(shù)強制轉(zhuǎn)換為數(shù)據(jù)框。比如,上面的d如果先用list()函數(shù)定義成了一個列表,就可以強制為一個數(shù)據(jù)框。
一個矩陣可以用data.frame()轉(zhuǎn)換為一個數(shù)據(jù)框,如果它原來有列名則其列名被作為數(shù)據(jù)框的變量名,否則系統(tǒng)自動為矩陣的各列起一個變量名(如X1,X2)。
引用數(shù)據(jù)框元素的方法與引用矩陣元素的方法相同,可以使用下標或下標向量,也可以使用名字或名字向量。如d[1:2, 2:3]。數(shù)據(jù)框的各變量也可以用按列表引用(即用雙括號[[]] 或$符號引用)。
數(shù)據(jù)框的變量名由屬性names定義,此屬性一定是非空的。數(shù)據(jù)框的各行也可以定義名字,可以用rownames屬性定義。如:
> names(d)[1] "name" "age" "height"> rownames(d)[1] "1" "2" "3"
數(shù)據(jù)框的主要用途是保存統(tǒng)計建模需要的數(shù)據(jù)。S的統(tǒng)計建模功能都需要以數(shù)據(jù)框為輸入數(shù)據(jù)。我們也可以把數(shù)據(jù)框當成一種矩陣來處理。
在使用數(shù)據(jù)框的變量時可以用“數(shù)據(jù)框名$變量名”的記法。但是,這樣使用較麻煩,S提供了attach()函數(shù)可以把數(shù)據(jù)框“連接”入當前的名字空間。例如,
> attach(d)
> r <- height / age
后一語句將在當前工作空間建立一個新變量r,它不會自動進入數(shù)據(jù)框d,要把新變量賦值到數(shù)據(jù)框中,可以用
> d$r <- height / age
這樣的格式。為了取消連接,只要調(diào)用detach()(無參數(shù)即可)。
注意:S和R中名字空間的管理是比較獨特的。它在運行時保持一個變量搜索路徑表,在讀取某個變量時到這個變量搜索路徑表中由前向后查找,找到最前的一個;在賦值時總是在位置1賦值(除非特別指定在其它位置賦值)。attach()的缺省位置是在變量搜索路徑表的位置2 ,detach()缺省也是去掉位置2。所以,S編程的一個常見問題是當你誤用了一個自己并沒有賦值的變量時有可能不出錯,因為這個變量已在搜索路徑中某個位置有定義,這樣不利于程序的調(diào)試,需要留心這樣的問題。
除了可以連接數(shù)據(jù)框,也可以連接列表。