在第3章,講到了矩陣matrix和向量vector,矩陣和向量都只能包含某壹種數據類型,而在實際應用中,這種情況比較少見。
當我們做壹項數據調查時,調查報告通常不可能只含有數值型數據或者字符型數據,而是包含各種數據類型(做分析時需要對目錄數據進行編碼,這部分內容會在python分析基礎中講到)。因此,我們需要壹種新的容器類型——data frame。
有人把data frame翻譯為數據幀,這種譯法是不準確的,尤其是考慮到“幀”的定義和data frame的含義的差別。也有人完全按照字面意思把它翻譯成數據框架,我感覺有些畫蛇添足,把原本不難理解的東西復雜化。
本章主要講了:
其實很簡單,用壹個例子就能解釋明白:中學時老師統計的期末成績單就是壹個df,通常壹個Excel表格中包含以下內容:
在實際操作中,我們通常讀取壹個Excel表單或者壹個csv文件,並將這個文件賦值給壹個變量(df或者data),後期對文件的操作可以通過變量名來進行。需要註意的是,df的每壹行表示不同的觀測對象,每壹列表示壹個定語或變量。在成績單裏,每個學生都是壹個被觀測的個體,而各科成績表示不同的定語(Attribute),定語是用來描述觀測對象的特征的。
下面我將采用R語言內置的數據集mtcars(motor trend car road tests)來做演示。
首先打開RStudio,用 data() 函數載入數據集:
通過前五行數據,我們可以看到,每行表示不同的汽車型號,列表示每個汽車型號的不同特征,例如排量,馬力,氣缸數等等。
通常在獲取壹個數據集後,我們需要了解它的結構,例如壹***有幾行,有哪些列,列的名字,每列的數據類型等。查看df的結構,需要 str() 函數。
輸出結果表示,mtcars壹***有32行(observations),和11列(variables)。
$符號後面是列名,壹***11個,且mtcars中所有的數據類型都是numerical。
前面使用了內置數據集,接下來可以使用 data.frame() 自己創建壹個,括號中填入不同的向量,這些向量必須包含相同的元素數量。
* 註意區分R和python在創建df時的不同語法
我們以太陽系內八大行星為例,建立壹個df,包含行星的名字,類型(巖質行星還是氣態巨行星),相對地球直徑的比值,相對地球公轉周期的比值以及是否含有星環(不止土星有星環)。
觀察壹下我們創建的df,不難發現每個向量就是df中的每壹列。(在python中有類似的用法,即通過字典dictionary創建df,參見python教程。)
跟矩陣和向量類似,我們可以選擇df的特定行和 / 或列。利用中括號,在逗號的左邊填入想選擇的行,右邊填入列。這個用法跟前面矩陣的元素選擇重復,這裏就省略了。
這裏介紹另外壹種方法,只用列名選擇某個特定的列:
df$colname
輸出的結果是壹個向量,可以用 class() 函數驗證向量元素的類型。
更進壹步,如果我們想選出有星環的行星,可以通過以下操作:
可以看出,我們篩選出了 rings 列中,值為 TRUE 的所有行。
那麽能否篩選不帶星環的行星?
方法很簡單,只需要在中括號中加入壹個 !
* 註意:由邏輯值組成的列通常被用來篩選符合某些條件的行,若沒有由邏輯值組成的列,我們可以通過邏輯運算符自己建立壹個篩選標準
現在我們嘗試找出影響行星是否有星環的因素。
對比這兩個結果,可以發現太陽系中的巖態行星都沒有星環,而氣態巨行星都有星環。因此我們可以猜測,影響壹個行星是否有星環的因素是行星的類型。當然這只是壹個假設,要想驗證這個假設在銀河系甚至可觀測宇宙是否成立,我們需要更多數據來進行 假設檢驗 ,這部分的內容需要懂點統計學,後面會講到。
上壹步實際上是給我們的數據集創建了壹個子集,用來過濾掉壹部分不需要i的數據。現在介紹壹種更高效、更普適的方式:
借助第二個arg,我們可以根據“某些條件”來選擇。這裏的條件覆蓋較廣的範圍,不再局限於邏輯值。
* 註意:這裏的‘單等於號’表示賦值,‘雙等於號’表示邏輯判斷
現在試試用numerical數據作為篩選條件,選出直徑比地球直徑大的行星:
排序要用到 order() 函數:
* 註意:decreasing默認為假,也就是說如果不填這個arg, order() 函數會進行升序排列