熱線電話:13121318867

登錄
首頁精彩閱讀R語言數據分析實戰:數據結構(2)
R語言數據分析實戰:數據結構(2)
2016-10-12
收藏

R語言數據分析實戰:數據結構(2)

4、數據框

由于不同的列可以包含不同模式(數值型、字符型等)的數據,數據框的概念較矩陣來說更為一般。它與你通常在SAS、SPSS和Stata中看到的數據集類似。數據框將是你在R語言中最常處理的數據結構。

表2-1所示的病例數據集包含了數值型和字符型數據。由于數據有多種模式,無法將此數據集放入一個矩陣。在這種情況下,使用數據框是最佳選擇。

數據框可通過函數data.frame()創建:

  1. mydata <- data.frame(col1, col2, col3,…)

其中的列向量col1, col2, col3,… 可為任何類型(如字符型、數值型或邏輯型)。每一列的名稱可由函數names指定。代碼清單2-4清晰地展示了相應用法。

每一列數據的模式必須唯一,不過你卻可以將多個模式的不同列放到一起組成數據框。由于數據框與數據分析人員通常設想的數據集的形態較為接近,我們在討論數據框時將交替使用術語列和變量。

選取數據框中元素的方式有若干種。你可以使用前述(如矩陣中的)下標記號,亦可直接指定列名。代碼清單2-5使用之前創建的patientdata數據框演示了這些方式。

第三個例子中的記號$是新出現的①。它被用來選取一個給定數據框中的某個特定變量。例如,如果你想生成糖尿病類型變量diabetes和病情變量status的列聯表,使用以下代碼即可:

  1. table(patientdata$diabetes, patientdata$status)
  2. Excellent Improved Poor
  3. Type1 1 0 2
  4. Type2 0 1 0

在每個變量名前都鍵入一次patientdata$可能會讓人生厭,所以不妨走一些捷徑??梢月摵鲜褂煤瘮礱ttach()和detach()或單獨使用函數with()來簡化代碼。

(1)attach()、detach()和with()

函數attach()可將數據框添加到R的搜索路徑中。R在遇到一個變量名以后,將檢查搜索路徑中的數據框,以定位到這個變量。以第1章中的mtcars數據框為例,可以使用以下代碼獲取每加侖行駛英里數(mpg)變量的描述性統計量,并分別繪制此變量與發動機排量(disp)和車身重量(wt)的散點圖

  1. summary(mtcars$mpg)
  2. plot(mtcars$mpg, mtcars$disp)
  3. plot(mtcars$mpg, mtcars$wt)

以上代碼也可寫成:

  1. attach(mtcars)
  2. summary(mpg)
  3. plot(mpg, disp)
  4. plot(mpg, wt)
  5. detach(mtcars)

函數detach()將數據框從搜索路徑中移除。值得注意的是,detach()并不會對數據框本身做任何處理。這句是可以省略的,但其實它應當被例行地放入代碼中,因為這是一個好的編程習慣。(接下來的幾章中,為了保持代碼片段的簡約和簡短,我可能會不時地忽略這條良訓。)當名稱相同的對象不止一個時,這種方法的局限性就很明顯了??紤]以下代碼:

  1. > mpg <- c(25, 36, 47)
  2. > attach(mtcars)
  3. The following object(s) are masked _by_ ‘.GlobalEnv’: mpg

  4. > plot(mpg, wt)
  5. Error in xy.coords(x, y, xlabel, ylabel, log) :
  6. ‘x’ and ‘y’ lengths differ

  7. > mpg
  8. [1] 25 36 47

這里,在數據框mtcars被綁定(attach)之前,我們的環境中已經有了一個名為mpg的對象。在這種情況下,原始對象將取得優先權,這與你想要的結果有所出入。由于mpg中有3個元素而disp中有32個元素,故plot語句出錯。函數attach()和detach()最好在你分析一個單獨的數據框,并且不太可能有多個同名對象時使用。任何情況下,都要當心那些告知某個對象已被屏蔽(masked)的警告。除此之外,另一種方式是使用函數with()。你可以這樣重寫上例:

  1. with(mtcars, {
  2. summary(mpg, disp, wt)
  3. plot(mpg, disp)
  4. plot(mpg, wt)
  5. })

在這種情況下,大括號{}之間的語句都針對數據框mtcars執行,這樣就無須擔心名稱沖突了。如果僅有一條語句(例如summary(mpg)),那么大括號{}可以省略。

函數with()的局限性在于,賦值僅在此函數的括號內生效??紤]以下代碼:

  1. with(mtcars, {
  2. stats <- summary(mpg)
  3. stats
  4. })
  5. Min. 1st Qu. Median Mean 3rd Qu. Max.
  6. 10.40 15.43 19.20 20.09 22.80 33.90
  7. > stats
  8. Error: object ‘stats’ not found

如果你需要創建在with()結構以外存在的對象,使用特殊賦值符<<-替代標準賦值符(<-)即可,它可將對象保存到with()之外的全局環境中。這一點可通過以下代碼闡明:

  1. with(mtcars, {
  2. nokeepstats <- summary(mpg)
  3. keepstats <<- summary(mpg)
  4. })
  5. > nokeepstats
  6. Error: object ‘nokeepstats’ not found
  7. > keepstats
  8. Min. 1st Qu. Median Mean 3rd Qu. Max.
  9. 10.40 15.43 19.20 20.09 22.80 33.90

相對于attach(),多數的R書籍更推薦使用with()。個人認為從根本上說,選擇哪一個是自己的偏好問題,并且應當根據你的目的和對于這兩個函數含義的理解而定。

(2) 實例標識符

在病例數據中,病人編號(patientID)用于區分數據集中不同的個體。在R語言中,實例標識符(case identifier)可通過數據框操作函數中的rowname選項指定。例如,語句:

  1. patientdata <- data.frame(patientID, age, diabetes, status,row.names=patientID)

將patientID指定為R語言中標記各類打印輸出和圖形中實例名稱所用的變量。

5、因子

變量可歸結為名義型、有序型或連續型變量。名義型變量是沒有順序之分的類別變量。糖尿病類型Diabetes(Type1、Type2)是名義型變量的一例。即使在數據中Type1編碼為1而Type2編碼為2,這也并不意味著二者是有序的。有序型變量表示一種順序關系,而非數量關系。病情Status(poor, improved, excellent)是順序型變量的一個上佳示例

我們明白,病情為poor(較差)病人的狀態不如improved(病情好轉)的病人,但并不知道相差多少。連續型變量可以呈現為某個范圍內的任意值,并同時表示了順序和數量。年齡Age就是一個連續型變量,它能夠表示像14.5或22.8這樣的值以及其間的其他任意值。很清楚,15歲的人比14歲的人年長一歲。

類別(名義型)變量和有序類別(有序型)變量在R語言中稱為因子(factor)。因子在R語言中非常重要,因為它決定了數據的分析方式以及如何進行視覺呈現。你將在本書中通篇看到這樣的例子。

函數factor()以一個整數向量的形式存儲類別值,整數的取值范圍是[1... k ](其中k 是名義型變量中唯一值的個數),同時一個由字符串(原始值)組成的內部向量將映射到這些整數上。

舉例來說,假設有向量:

  1. diabetes <- c("Type1", "Type2", "Type1", "Type1")

語句diabetes <- factor(diabetes)將此向量存儲為(1, 2, 1, 1),并在內部將其關聯為1=Type1和2=Type2(具體賦值根據字母順序而定)。針對向量diabetes進行的任何分析都會將其作為名義型變量對待,并自動選擇適合這一測量尺度的統計方法。

要表示有序型變量,需要為函數factor()指定參數ordered=TRUE。給定向量:

  1. status <- c("Poor", "Improved", "Excellent", "Poor")

語句status <- factor(status, ordered=TRUE)會將向量編碼為(3, 2, 1, 3),并在內部將這些值關聯為1=Excellent、2=Improved以及3=Poor。另外,針對此向量進行的任何分析都會將其作為有序型變量對待,并自動選擇合適的統計方法。

對于字符型向量,因子的水平默認依字母順序創建。這對于因子status是有意義的,因為“Excellent”、“Improved”、“Poor”的排序方式恰好與邏輯順序相一致。如果“Poor”被編碼為“Ailing”,會有問題,因為順序將為“Ailing”、“Excellent”、“Improved”。如果理想中的順序是“Poor”、“Improved”、“Excellent”,則會出現類似的問題。按默認的字母順序排序的因子很少能夠讓人滿意。

你可以通過指定levels選項來覆蓋默認排序。例如:

  1. status <- factor(status, order=TRUE,
  2. levels=c("Poor", "Improved", "Excellent"))

各水平的賦值將為1=Poor、2=Improved、3=Excellent。請保證指定的水平與數據中的真實值相匹配,因為任何在數據中出現而未在參數中列舉的數據都將被設為缺失值。

代碼清單2-6演示了普通因子和有序因子的不同是如何影響數據分析的。

首先,以向量的形式輸入了數據①。然后,將diabetes和status分別指定為一個普通因子和一個有序型因子。最后,將數據合并為一個數據框。函數str(object)可提供R語言中某個對象(本例中為數據框)的信息②。它清楚地顯示diabetes是一個因子,而status是一個有序型因子,以及此數據框在內部是如何進行編碼的。注意,函數summary()會區別對待各個變量③。它顯示了連續型變量age的最小值、最大值、均值和各四分位數,并顯示了類別型變量diabetes和status(各水平)的頻數值。

6、列表

列表(list)是R的數據類型中最為復雜的一種。一般來說,列表就是一些對象(或成分,component)的有序集合。列表允許你整合若干(可能無關的)對象到單個對象名下。例如,某個列表中可能是若干向量、矩陣、數據框,甚至其他列表的組合??梢允褂煤瘮祃ist()創建列表:

  1. mylist <- list(object1, object2, …)

其中的對象可以是目前為止講到的任何結構。你還可以為列表中的對象命名:

  1. mylist <- list(name1=object1, name2=object2, …)

代碼清單2-7展示了一個例子。

本例創建了一個列表,其中有四個成分:一個字符串、一個數值型向量、一個矩陣以及一個字符型向量??梢越M合任意多的對象,并將它們保存為一個列表。

你也可以通過在雙重方括號中指明代表某個成分的數字或名稱來訪問列表中的元素。此例中,mylist[[2]]和mylist[["ages"]]均指那個含有四個元素的向量。由于兩個原因,列表成為了R語言中的重要數據結構。首先,列表允許以一種簡單的方式組織和重新調用不相干的信息。其次,許多R函數的運行結果都是以列表的形式返回的。需要取出其中哪些成分由分析人員決定。

數據分析咨詢請掃描二維碼

若不方便掃碼,搜微信號:CDAshujufenxi

數據分析師資訊
更多

OK
客服在線
立即咨詢
日韩人妻系列无码专区视频,先锋高清无码,无码免费视欧非,国精产品一区一区三区无码
客服在線
立即咨詢