Last updated: October 2009. Kajiyama                    [ 目次に戻る ]

クロス集計表から「スタック」形式のデータフレームへデータ変換


  1.  データセット HairEyeColorの情報

    Rに前もって組み込みこまれたクロス表「HairEyeColor」がある.


    表1  性別(2)髪の毛の色(4)目の色(4)の変数とカテゴリーの2x4x4クロス表

    592人を対象に性別,髪の毛の色,目の色を調べた結果がこの表である.

      男性male 女性female
    髪の毛の色 目の色eye color 目の色eye color
    hair color Brown Blue Hazel Green Brown Blue Hazel Green
    Black 32 11 10 3 36 9 5 2
    Brown 53 50 25 15 66 34 29 14
    Red 10 10 7 7 16 7 7 7
    Blond 3 30 5 8 4 64 5 8


    ? HairEyeColor #  と記述し, データ HairEyeColor のヘルプ情報を,表示し確認する.

    
    > ? HairEyeColor
    
    Description
    Distribution of hair and eye color and sex in 592 statistics students. 
    
    Format
    A 3-dimensional array resulting from cross-tabulating 592 observations on 3 variables. 
    The variables and their levels are as follows: 
    
    No  Name  Levels  
    1  Hair  Black, Brown, Red, Blond  
    2  Eye  Brown, Blue, Hazel, Green  
    3  Sex  Male, Female  
    
    Details
    The Hair x Eye table comes rom a survey of students at the University of Delaware reported by Snee (1974). 
    The split by Sex was added by Friendly (1992a) for didactic purposes. 
    This data set is useful for illustrating various techniques for the analysis of contingency tables, 
    such as the standard chi-squared test or, more generally, log-linear modelling, 
    and graphical methods such as mosaic plots, sieve diagrams or association plots.
    
    Source
    http://euclid.psych.yorku.ca/ftp/sas/vcd/catdata/haireye.sas 
    Snee (1974) gives the two-way table aggregated over Sex. 
    The Sex split of the ‘Brown hair, Brown eye’ cell was changed in R 2.6.0 to agree with that used by Friendly (2000). 
    
    
    Examples #  練習問題
    require(graphics)
    ## Full mosaic
    mosaicplot(HairEyeColor)
    ## Aggregate over sex (as in Snee's original data)
    x <- apply(HairEyeColor, c(1, 2), sum)
    x
    mosaicplot(x, main = "Relation between hair and eye color") 
    




    (2) 「Examples」の練習問題でクロス表HairEyeColorからグラフ作成


    
    > require(graphics) #  インストールされたgraphicsパッケージの読み込み
    
    > HairEyeColor #  HairEyeColor 性別x髪の毛の色x目の色のデータを表示
    , , Sex = Male
    
           Eye
    Hair    Brown Blue Hazel Green
      Black    32   11    10     3
      Brown    53   50    25    15
      Red      10   10     7     7
      Blond     3   30     5     8
    
    , , Sex = Female
    
           Eye
    Hair    Brown Blue Hazel Green
      Black    36    9     5     2
      Brown    66   34    29    14
      Red      16    7     7     7
      Blond     4   64     5     8
    
    > mosaicplot(HairEyeColor, main = "Relation between hair, eye color and sex")  #  性別x髪の毛の色x目の色のグラフ作図
    
    
    > hec <- apply(HairEyeColor, c(1, 2), sum)  #  男女を合計して,髪の毛の色x目の色のデータに加工する
    
    > hec #  髪の毛の色x目の色のデータを表示
           Eye
    Hair    Brown Blue Hazel Green
      Black    68   20    15     5
      Brown   119   84    54    29
      Red      26   17    14    14
      Blond     7   94    10    16
    
    > mosaicplot(hec, main = "Relation between hair and eye color") # 髪の毛の色x目の色のグラフ作図
    

     


  2.  読み込んだデータがデータフレームでないことを確認する


    (1) データの読み込み

    HairEyeColor #  と記述し,Rの内部にあるクロス表 HairEyeColor を,表示し確認する.データセットの内容ではないことに注意する.

    
    > HairEyeColor
    
    , , Sex = Male
    
           Eye
    Hair    Brown Blue Hazel Green
      Black    32   11    10     3
      Brown    53   50    25    15
      Red      10   10     7     7
      Blond     3   30     5     8
    
    , , Sex = Female
    
           Eye
    Hair    Brown Blue Hazel Green
      Black    36    9     5     2
      Brown    66   34    29    14
      Red      16    7     7     7
      Blond     4   64     5     8
    


    (2) 読み込んだデータの構造の確認

    str( HairEyeColor ) #  と記述し,Rの内部のクロス表 HairEyeColor の変数の内容を表示確認する

    
    > str( HairEyeColor )
    
     table [1:4, 1:4, 1:2] 32 53 10 3 11 50 10 30 10 25 ...
     - attr(*, "dimnames")=List of 3
      ..$ Hair: chr [1:4] "Black" "Brown" "Red" "Blond"
      ..$ Eye : chr [1:4] "Brown" "Blue" "Hazel" "Green"
      ..$ Sex : chr [1:2] "Male" "Female"
    


    (3) 表シートで表示できないことを確認

    fix( HairEyeColor ) #  と記述し,Rの内部のクロス表 HairEyeColor の内容を表シート fix()で確認する

    
    > fix( HairEyeColor )
    
    structure(c(32, 53, 10, 3, 11, 50, 10, 30, 10, 25, 7, 5, 3, 15, 7, 8, 36, 66, 16, 4, 9, 34, 7, 64, 5, 29, 7, 5, 2, 14, 7, 8), 
    .Dim = c(4L, 4L, 2L), 
    .Dimnames = structure(list(
    Hair = c("Black", "Brown", "Red", "Blond"), 
    Eye = c("Brown", "Blue", "Hazel", "Green"), 
    Sex = c("Male", "Female")), 
    .Names = c("Hair", "Eye", "Sex")
    ), class = "table")
    

    表シート fix()が表示できない.データ「HairEyeColor」は「アンスタック形式」や「スタック形式」のデータフレームではないことがわかる.



  3.  クロス表から変数の組み合わせごとの元の「スタック」形式のデータフレームを復元

    x <- data.frame(HairEyeColor) #  と記述し,Rの内部のクロス表 HairEyeColor の内容を「スタック」形式のデータフレーム x に変換する.

    x #  と記述し,Rの内部の「スタック」形式のデータフレーム x の内容を表示する.



  4.  592人の個人データを「スタック」形式のデータフレームで復元し原表を作成する  出典 "Rによる統計解析",青木繁伸,オーム社,p57-60.

    例えば,上の表の最初の[1 Black Brown Male 32]のデータは,[Black Brown Male]の組み合わせの32人分の個人データである.

    この度数分布のデータをさらに592人の個人データに復元する.

    y <- data.frame( lapply (x, function(i) rep(i, x[,"Freq"] ) )[-4] ) #  と記述し,

    Rの内部のクロス表 x の内容を個人データの「スタック」形式のデータフレーム y に変換する.

    y #  と記述し,Rの内部のデータフレーム y の内容を表示する.スタック形式の592人の個人データである.

    
    > x <- data.frame(HairEyeColor)
    > x 
        Hair   Eye    Sex Freq
    1  Black Brown   Male   32
    2  Brown Brown   Male   53
    3    Red Brown   Male   10
    4  Blond Brown   Male    3
    5  Black  Blue   Male   11
    6  Brown  Blue   Male   50
    7    Red  Blue   Male   10
    8  Blond  Blue   Male   30
    9  Black Hazel   Male   10
    10 Brown Hazel   Male   25
    11   Red Hazel   Male    7
    12 Blond Hazel   Male    5
    13 Black Green   Male    3
    14 Brown Green   Male   15
    15   Red Green   Male    7
    16 Blond Green   Male    8
    17 Black Brown Female   36
    18 Brown Brown Female   66
    19   Red Brown Female   16
    20 Blond Brown Female    4
    21 Black  Blue Female    9
    22 Brown  Blue Female   34
    23   Red  Blue Female    7
    24 Blond  Blue Female   64
    25 Black Hazel Female    5
    26 Brown Hazel Female   29
    27   Red Hazel Female    7
    28 Blond Hazel Female    5
    29 Black Green Female    2
    30 Brown Green Female   14
    31   Red Green Female    7
    32 Blond Green Female    8
    

    3変数の組合毎の度数のデーターフレームが作成される.
    
    > y <- data.frame( lapply (x, function(i) rep(i, x[,"Freq"]))[-4] )  
    > y 
          Hair   Eye    Sex
    1   Black Brown   Male
    2   Black Brown   Male
    3   Black Brown   Male
    4   Black Brown   Male
    5   Black Brown   Male
    6   Black Brown   Male
    7   Black Brown   Male
    8   Black Brown   Male
    9   Black Brown   Male
    10  Black Brown   Male
    ・・・・・・・・・・・
    ・・・・・・・・・・・
    570 Brown Green Female
    571 Brown Green Female
    572 Brown Green Female
    573 Brown Green Female
    574 Brown Green Female
    575 Brown Green Female
    576 Brown Green Female
    577 Brown Green Female
    578   Red Green Female
    579   Red Green Female
    580   Red Green Female
    581   Red Green Female
    582   Red Green Female
    583   Red Green Female
    584   Red Green Female
    585 Blond Green Female
    586 Blond Green Female
    587 Blond Green Female
    588 Blond Green Female
    589 Blond Green Female
    590 Blond Green Female
    591 Blond Green Female
    592 Blond Green Female
    

    592サンプルのデーターフレームが作成される.

[ 目次に戻る ]