1. 程式人生 > >在R語言中建立、使用資料框

在R語言中建立、使用資料框

《R語言實戰》筆記 —— 建立資料集之資料框

  • 資料框是R中最常處理的資料結構,資料框不同的列可以包含不同模式(數值型、字元型等)的資料。

 1. 建立資料框

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

其中,列向量col1, col2, col3,...可為任意型別(如字元型、數值型或邏輯性),每一列的名稱可由函式names指定。

# 程式碼1
> age <- c(25,34,28,52)
> diabetes <- c("Type1", "Type2", "Type1", "Type1")


> status <- c("Poor","Improved","Excellent","Poor")
> patientdata <- data.frame(patientID, age, diabetes, status)
> patientdata
  patientID age diabetes    status
1         1  25    Type1      Poor
2         2  34    Type2  Improved
3         3  28    Type1 Excellent
4         4  52    Type1      Poor

# 每一列資料的模式必須唯一,不過可以將多個模式的不同列放到一起組成一個數據框,這其實與資料庫表十分類似。

2. 選取資料框中的元素

選取資料框中元素的方式有若干種,可以使用如矩陣中的下標記號,亦可直接指定列名。
# 程式碼2
> patientdata[1:2]
  patientID age
1         1  25
2         2  34
3         3  28
4         4  52

> patientdata[c("diabetes","status")]
  diabetes    status
1    Type1      Poor
2    Type2  Improved
3    Type1 Excellent
4    Type1      Poor

> patientdata$age
[1] 25 34 28 52
記號"$"是資料框中特有的表示方法,它可以選取資料框中的某個特定變數。 例如,生成變數diabetes和變數status的列聯表:
> table(patientdata$diabetes, patientdata$status)
       
        Excellent Improved Poor
  Type1         1        0    2
  Type2         0        1    0

  • 在每個變數名前都需要鍵入一次patientdata$很麻煩,可以聯合使用函式attach()和detach()或單獨使用函式with()來簡化程式碼

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

  • 函式attach()可將資料框新增到R的搜尋路徑中,R遇到一個變數名時將檢查搜尋路徑中的資料框來定位變數。
# 以R語言內建資料集mtcars為例,獲取每加侖行駛英里數(mpg)變數的描述性統計量,並繪製此變數與發動機排量(disp)和車身重量(wt)的散點圖
> data(mtcars)
> summary(mtcars$mpg)

   Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
  10.40   15.43   19.20   20.09   22.80   33.90 

> plot(mtcars$mpg, mtcars$disp)
> plot(mtcars$mpg, mtcars$wt)

# 也可寫成
> attach(mtcars)
>   summary(mpg)
   Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
  10.40   15.43   19.20   20.09   22.80   33.90 

>   plot(mpg, disp)
>   plot(mpg, wt)
> detach(mtcars)

# 函式detach()將資料框從搜尋路徑中移除,注意detach()並不會對資料框本身做任何處理,是可以被省略的,但其實它應當被例行的放入程式碼中,因為這是一個好的程式設計習慣。
# 另一種方式是使用函式with()
with(mtcars, {
  summary(mpg, disp, wt)
  plot(mpg, disp)
  plot(mpg, wt)
})
# 這種情況下,大括號{}之間的語句都針對資料框mtcars執行,這樣就無需擔心名稱衝突問題。
# 函式with的侷限性在於, 賦值僅在次函式的括號內生效。
> with(mtcars, {
+   stats <- summary(mpg)
+   stats
+ })

   Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
  10.40   15.43   19.20   20.09   22.80   33.90 

> stats
Error: object 'stats' not found
# 若需要建立在with()結構以外存在的物件,使用特殊賦值符號 <<-替代標準賦值符號,可以將物件儲存在with以外的全域性環境中
> with(mtcars, {
+   nokeepstats <- summary(mpg)
+   keepstats <<- summary(mpg)
+ })
> nokeepstats

Error: object 'nokeepstats' not found
> keepstats
   Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
  10.40   15.43   19.20   20.09   22.80   33.90 

(2) 例項識別符號

  • 在病歷資料中,病人編號(patientID)用於區分資料集中不同的個體。在R中,例項識別符號(case identifier)可通過資料框操作函式中的rowname選項指定。
> patientID <- c('a','b','c','d')
> patientdata <- data.frame(patientID, age, diabetes, status,
+                           row.names = patientID)
> patientdata

  patientID age diabetes    status
a         a  25    Type1      Poor
b         b  34    Type2  Improved

c         c  28    Type1 Excellent
d         d  52    Type1      Poor