http://netstat.stat.tku.edu.tw
(User from: 54.162.218.214)
機率  |  統計  |  Data Mining  |  資料處理  |  DEMO  |  Data  |  Links  |  Books  |  相關文件  |   ( ENGLISH )

Home

機率
 計算/查表
 隨機亂數
 Density plots
統計
 基本統計
 卡方檢定
 迴歸分析
 ANOVA
 時間數列
 多變量分析
 品質管制
 無母數方法
Data Mining
 決策樹
 Logistic
 判別分析
 集群分析
 類神經網路
 關聯規則分析
 ALL Methods

R 軟體入門:3.變數型態

by Steve Chen ( , 版權所有, 歡迎散佈)

Section 3 簡介
在這個 section 中, 我們將學會 R 的重要資料型態

3-1 資料型態定義

定義 (1): 一般的資料檔由 "(橫)列" (row) 跟 "(直)行" (column) 構成.
一個橫列通常是包含一個"個體"(object,人或物) 的所有資料.
一個直行通常是指一個變數 (variable). 例如範例資料中的腦容量與 IQ data:

Gender FSIQ VIQ PIQ Weight Height BrainSize
0      133  132 124 118    64.5   816932  
1      139  123 150 143    73.3   1038437  
1      133  129 128 172    68.8   965353  
..........................................
在這個資料檔中, 每一個橫列代表一個學生的所有測量值,
每一個直行代表某個變數的所有資料.

定義 (2): R 的資料型態

以下資料型態是由最簡單的開始排起:

  • Vector (向量):
    有數字指標 (1,2,3...) 的排序物件 (object)

    x <- c(11,12,13.0,14,15,16)
    x[2] # 12
    x[2:3] # 12,13
    x[c(2,5,6)] # 12,15,16
    length(x) # x vector 長度 = 6
    
  • Array (陣列) :
    多維 vector, 但是多了 dim (dimention) 性質
    x <- array(1:20,dim=c(4,5)) 
    # 建立 4 x 5 的 array (= matrix)
    > x
         [,1] [,2] [,3] [,4] [,5]
    [1,]    1    5    9   13   17
    [2,]    2    6   10   14   18
    [3,]    3    7   11   15   19
    [4,]    4    8   12   16   20
    
    > length(x)                  # x 的元素個數
    [1] 20
    > nrow(x)                    # 橫列數目
    [1] 4
    > ncol(x)                    # 直行數目
    [1] 5
    > x[1,]  # 第 1 橫列 (row)
    [1]  1  5  9 13 17
    > x[,2]                      # 第 2 直行 (column)
    [1] 5 6 7 8
    > x[1,2]                     # 某個特定元素 (第 1 列, 第 2 行)
    [1] 5
    > y <- x[1,c(2,3)]           # 取出第一列,第 2,3 行的元素
    > y
    [1] 5 9
    > y <- x[2:3,c(2,3)]         # 取出第 2,3 列 and 第 2,3 行的所有元素
                                 # 此時, y 將是一個新的 matrix
    > y
         [,1] [,2]
    [1,]    6   10
    [2,]    7   11
    > y[,1]
    [1] 6 7
    > y[,1][2]
    [1] 7
    > y[2,1] # 與上式相同結果
    [1] 7
    
    > rownames(y) <- c("case 1","case 2")  # 給定橫列名稱 (row names)
    > y
           [,1] [,2]
    case 1    6   10
    case 2    7   11
    > colnames(y) <- c("Y1","Y2")          # 給定直行名稱 (column names)
    > y
           Y1 Y2
    case 1  6 10
    case 2  7 11
    > colnames(y) <- c("汽車","機車")      # 可以使用中文名稱
    > y
           汽車 機車
    case 1    6   10
    case 2    7   11
    
    > x <- array(1:8,dim=c(2,2,2))         # 建立 3 維 array
    > x
    , , 1
    
         [,1] [,2]
    [1,]    1    3
    [2,]    2    4
    
    , , 2
    
         [,1] [,2]
    [1,]    5    7
    [2,]    6    8
    
    > x[1,2,2]
    [1] 7
    
  • Matrix (矩陣): Array 的 2 維特例

    > yy <- matrix(1:20,nrow=5,ncol=4)  # 利用 matrix 函數來建構 matrix
    > yy
         [,1] [,2] [,3] [,4]
    [1,]    1    6   11   16
    [2,]    2    7   12   17
    [3,]    3    8   13   18
    [4,]    4    9   14   19
    [5,]    5   10   15   20
    
    > y <- c(1,4,5,7,9,8)
    > yy <- matrix(y,nrow=2,ncol=3)   # 注意: 順序是以 "直行" 為主
    > yy
         [,1] [,2] [,3]
    [1,]    1    5    9
    [2,]    4    7    8
    
    > yy <- matrix(y,nrow=2,ncol=3,byrow=TRUE)
    > yy
         [,1] [,2] [,3]
    [1,]    1    4    5
    [2,]    7    9    8
    
    > x1 <- c(1,2,3)
    > x2 <- c(2,4,6)         # x1 與 x2 是普通 vector (向量)
    > xx <- rbind(x1,x2)     # 利用 rbind (row-bind) 建構 matrix
    > xx                     # bind 是結合的意思
       [,1] [,2] [,3]
    x1    1    2    3
    x2    2    4    6
    > xx <- cbind(x1,x2)     # 利用 cbind (column-bind) 建構 matrix
    > xx
         x1 x2
    [1,]  1  2
    [2,]  2  4
    [3,]  3  6
    > xx <- cbind(1.0,x1,x2) # 也可以跟常數 (1.0) bind 在一起
    > xx
           x1 x2
    [1,] 1  1  2
    [2,] 1  2  4
    [3,] 1  3  6
    
    > attributes(xx)
    $dim
    [1] 3 3
    
    $dimnames
    $dimnames[[1]]
    NULL
    
    $dimnames[[2]]
    [1] ""   "x1" "x2"
    > names(xx)
    NULL
    > colnames(xx)
    [1] ""   "x1" "x2"
    > rownames(xx)
    NULL
    > colnames(xx) <- c("第一行","第二行","第三行")
    > xx
         第一行 第二行 第三行
    [1,]      1      1      2
    [2,]      1      2      4
    [3,]      1      3      6
    
    > dimnames(xx)
    [[1]]
    NULL
    
    [[2]]
    [1] "第一行" "第二行" "第三行"
    > rownames(xx) <- c("Block1","Block2","Block3")
    > xx
           第一行 第二行 第三行
    Block1      1      1      2
    Block2      1      2      4
    Block3      1      3      6
    
    > rownames(xx) <- paste("Factor",1:3, sep="")   # 利用 paste 來造出 row names
    > xx
             第一行 第二行 第三行
    Factor1      1      1      2
    Factor2      1      2      4
    Factor3      1      3      6
    
    > rownames(xx) <- c("第一列","第二列","第三列")
    > xx
           第一行 第二行 第三行
    第一列      1      1      2
    第二列      1      2      4
    第三列      1      3      6
    
    > xx[1,]
    第一行 第二行 第三行
         1      1      2
    
    > xx[3,]
    第一行 第二行 第三行
         1      3      6
    
    > xx[,2]
    第一列 第二列 第三列
         1      2      3
    
    > xx[1:2,2:3]
           第二行 第三行
    第一列      1      2
    第二列      2      4
    
    > yy <- xx[c(1,3),2:3]
    > yy
           第二行 第三行
    第一列      1      2
    第三列      3      6
    
    
  • Factor (因子):
    就像統計學中的分類變數, 擁有
    • 分類名稱,
    • 所有個別觀察值的原始資料
    共 2 種特質.

    > x <- c("Yes","No","No","Yes","Yes")
    > x
    [1] "Yes" "No" "No" "Yes" "Yes"
    
    > factor(x)
    [1] Yes No No Yes Yes
    Levels: No Yes
    
    > z <- tabulate(x)     # 計算 Factor x 當中各分類的物件 (objects) 總數
    > z
    [1] 2 3
    > z[2]                 # 第 2 個分類的物件 (objects) 總數
    [1] 3
    
    > table(x)        # 同上, 但產生的 output 帶有分類名稱
    x
     No Yes
      2   3
    
    > state <- c("tas", "sa", "qld", "nsw", "nsw", "nt", "wa", "wa",
    "qld", "vic", "nsw", "vic", "qld", "qld", "sa", "tas",
    "sa", "nt", "wa", "vic", "qld", "nsw", "nsw", "wa",
    "sa", "act", "nsw", "vic", "vic", "act")
    
    > statef <- factor(state)
    
    > statef
    [1] tas sa qld nsw nsw nt wa wa qld vic nsw vic qld qld sa
    [16] tas sa nt wa vic qld nsw nsw wa sa act nsw vic vic act
    Levels: act nsw nt qld sa tas vic wa
    
    > levels(statef)
    [1] "act" "nsw" "nt" "qld" "sa" "tas" "vic" "wa"
    
  • List (串列):
    跟 Vector 一樣是排序物件, 但可以包含不同性質的物件, 而且還有 "名稱指標". List 變數通常是作為函數的傳回物件。例如:
    > myLst <- list(name="Fred", wife="Mary", no.children=3,child.ages=c(4,7,9))
    > myLst
    $name
    [1] "Fred"
    
    $wife
    [1] "Mary"
    
    $no.children
    [1] 3
    
    $child.ages
    [1] 4 7 9
    
    > attributes(myLst)
    $names
    [1] "name"        "wife"        "no.children" "child.ages"
    
    > myLst$name              # 也可使用 myLst[[1]]
    [1] "Fred"
    > myLst$[["name"]]
    [1] "Fred"
    
    > # list 的用法中, [ ... ]  與 [[ ... ]] 不同. 
    > # [ ... ] 會傳回另一個 list
    > # [[ ... ]] 只會傳回一個 vector
    > y1 <- myLst[1]
    > y1
    $name
    [1] "Fred"
    
    > y2 <- myLst[[1]]
    > y2
    [1] "Fred"
    
    > is.list(y1)
    [1] TRUE
    > is.list(y2)
    [1] FALSE
    
    > is.vector(y1)
    [1] TRUE
    > is.vector(y2)
    [1] TRUE
    
    > attributes(y1)
    $names
    [1] "name"
    
    > attributes(y2)
    NULL
    
    > myLst$wife              # 也可使用 myLst[[2]]
    [1] "Mary"
    
    > myLst$child.ages
    [1] 4 7 9
    
    > myLst$child.ages
    [1] 4 7 9
    
    > myLst$child.ages[2]     # List 的第 4 個元素 "child.ages" 是個 vector
    [1] 7
    
    > myLst$child.ages[2:3]
    [1] 7 9
    
    > list.a["cat"] = 3
    > money["johm"] = 2000
    

  • Data Frame (資料框架): a list of columns vectors, 各 vectors 長度相同
    矩陣 (matrix) 的延伸, 可視為 matrix 與 list 的混合型態, 因為 data frame 中可以包含不同型態的變數. data frame 的各. Data frame 有
    • 每個 column 的名稱: 相當於資料檔中的變數 名稱, 如果輸入時沒有指定, 則內定為 V1,V2,...
    • 每個 row 的名稱: 相當於資料檔中個別觀察值的名稱, 例如姓名

    > weight = c(150, 135, 210, 140)
    > height = c(65, 61, 70, 65)
    > gender = c("Fe","Fe","M","Fe")
    > study = data.frame(weight,height,gender)  # 產生新的 data frame
    > study
    weight height gender
    1 150 65 Fe
    2 135 61 Fe
    3 210 70 M
    4 140 65 Fe
    
    > data.frame(w=weight,h=height,g=gender) # 使用新的變數名稱
    
    > expand.grid(h=seq(60,80,10), w=seq(100,300,100), sex=c("Male","Female"))
    > # 以各變數交叉模式創造 data frame
    h w sex
    1 60 100 Male
    2 70 100 Male
    3 80 100 Male
    4 60 200 Male
    5 70 200 Male
    6 80 200 Male
    7 60 300 Male
    8 70 300 Male
    9 80 300 Male
    10 60 100 Female
    11 70 100 Female
    12 80 100 Female
    13 60 200 Female
    14 70 200 Female
    15 80 200 Female
    16 60 300 Female
    17 70 300 Female
    18 80 300 Female
    
3-2 Indexing: 找出多維物件的部分元素

  • 3 種基本的指標用法 :

    1. x[i]         # 取出 x 的第 i 個元素, 包含 names 跟 dimnames 特性
      x[[i]]        # 取出 x 的第 i 個元素, 包含 names 跟 dimnames 特性


    2. x[i, j]         # 取出 x 的第 (i,j) 元素, 包含 names 跟 dimnames 特性
      x[[i, j]]        # 取出 x 的第 (i,j) 元素, 包含 names 跟 dimnames 特性

    3. 使用物件的定名指標 (name) 來找出元素
      x$a
      x$"a"

  • vectorsmatrices
    x[[i]] or x[i] 形式都可使用

  • list
    mylist[[3]] 取出元素
    mylist[3] 取出元素, 此時這個值將會是一個 list
    mylist$address 使用元素的名稱指標來取出元素

  • data frame
    > Cars93.summary$abbrev
    > Cars93.summary[,4]
    > Cars93.summary[,"abbrev"]
    > Cars93.summary[[4]]
     
    >brain.wt <- primates$Brainwt
    >brain.wt <- primates[,3]
    >brain.wt <- primates[,"Brainwt"]
    >brain.wt <- primates[[3]]
    

  • x[[expr]] : 計算指標值之後再取出元素. 例如 x[[3*2-1]]