スマホ用は別頁
=== 読者が配色を変更したい場合 ===
◎外側の色を変えるには,次の色をクリック
◎内側の色を変えるには,次の色をクリック
標準文字色を変えるには,次の色をクリック
《自分用memo》
== Rによる度数分布表,クロス集計表の作成 ==

R version 4.0.3 (2020-10-10)
R version 4.0.4 Patched (2021-02-17)
----- 最終更新年月日:2021.3.21
1. CSVファイルの読み込み
1.1 CSVファイルとは
 CSVとは,「Comma Separated Value」(カンマで区切った値)の頭文字で,Excelなどの表計算ソフトのデータの値の部分はCSVファイルというカンマ区切りに書かれたテキストファイルで書けます.
 ExcelからCSVファイルを読み出すことができ,Excelデータのうちで1枚のシートから成るデータはCSVファイルとして保存することができます.
childagesportfruit
大人35野球りんご
子供12サッカーみかん
大人26野球みかん
子供10野球みかん
大人41野球りんご
【例1.1.1】
 右のようなExcelデータがあるとする.1行目は列見出し(列タイトル)で,2行目以下は各行が1人分のデータを表す.
 このExcelデータをExcelの中からファイル→名前を付けて保存→ファイルの種類:カンマ区切り(*.CSV)で保存すると,次のようなテキストファイルができる.
child,age,sport,fruit
大人,35,野球,りんご
子供,12,サッカー,みかん
大人,26,野球,みかん
子供,10,野球,みかん
大人,41,野球,りんご
⇒文字列から成る要素も数値から成る要素もカンマ(,)で区切られて並べられる.上から何番,左から何番ということで管理される.
 「カンマ区切り」ということから分かるように,カンマは区切り記号に使われているので,カンマ自体を含むデータは文字列を示すダブルクォート(" ")の中に入れて表す.・・・ExcelでCSVファイルとして保存するときに自動的に付けられる.
child,age,寄付金,sport,fruit
大人,35,"1,200",野球,りんご
子供,12,120,サッカー,みかん
大人,26,"3,500",野球,みかん
子供,10,80,野球,みかん
大人,41,500,野球,りんご

1.2 RでCSVファイル読み込むには
(1) ファイルがRで指定された作業用フォルダ(ディレクトリ)におかれていれば,単純にファイル名を書けば利用できます.
 現在設定されている作業用フォルダを調べるには(wd→working directoryの略と考える)
getwd()
⇒例えば, "C:/Users/yourname/Documents"などと返される.
 作業用フォルダを"C:/data/for_R"に変更するには
setwd("C:/data/for_R")
• getwd()で示されたフォルダにファイルを置けば、ファイル名だけでRを使った作業ができる.
• setwd(".....")を使えば,作業用ディレクトリを変更できる・・・ただし,Rを終了すれば元の設定に戻る.
 元の設定を変更するには,Rコンソールのメニュー画面から,ファイル→ディレクトリの変更を行うとよい.
• その時だけ使うファイルは,作業用ディレクトリを変更しなくても,フルパスで"C:/data/tmp/abc.csv"などと書けばよい.
(2) RでCSVファイルを読み込むには
read.csv("ファイル名")
 (1)で説明したように,ファイルが作業用フォルダになれば,ファイル名だけでよく,他のフォルダにあるときはフルパスでファイル名を書けばよい.
RでCSVファイルを読み込んで,次の作業につないでいくには
name1<-read.csv("ファイル名")
などと書く.これにより,文字・数値のどちらも含むことのできるデータフレームの変数名name1にCSVファイルの内容が代入される.
 読み込まれたデータフレームの内容は,変数名name1を書けば表示される.
child,age,sport,fruit
大人,35,野球,りんご
子供,12,サッカー,みかん
大人,26,野球,みかん
子供,10,野球,みかん
大人,41,野球,りんご

2. 度数分布表,クロス集計表の作成
2.1 度数分布表とは
child<-c("大人","子供","大人","大人","大人","子供")
のように1次元のデータ(ベクトル)が変数名childで保存されているとき,このデータに含まれる値が各々何個あるかを数え上げるには
table(child)
と書きます.
⇒結果は,次のような度数分布表として出力されます.
child
子供 大人 
   2    4 
 上記のように,関数table(ベクトル)は,1次元のデータをベクトルとして与えると,度数分布表として出力する.あるデータフレームdata1の1つの列データがchildという名前で保存されているとき,その1次元ベクトルは
data1$child
という形でドルマーク($)を使って取り出せる.
data1
childagesportfruit
大人35野球りんご
子供12サッカーみかん
大人26野球みかん
子供10野球みかん
大人41野球りんご
そこで,右図のようなデータテーブルdata1からchildという列にある要素の度数分布表を作るには,
table(data1$child)
とすればよい.これにより
子供 大人 
   2    3
が得られる.
 同様にして
table(data1$fruit)
により
みかん りんご 
     3      2 
が得られる.

2.2 クロス集計表とは
data1
childagesportfruit
大人35野球りんご
子供12サッカーみかん
大人26野球みかん
子供10野球みかん
大人41野球りんご
(1) 右図のようなデータテーブルdata1から,好きなスポーツ(sport)と好きな果物(fruit)の組み合わせを調べると
           みかん りんご
  サッカー      1      0
  野球          2      2
が得られる.この表をクロス集計表という.
 このクロス集計表を求めるための入力は
table(data1$sport, data1$fruit)
となっている.このように,関数table()は2次元までのクロス集計を得るのに適している.
 他の例では,
table(data1$child, data1$sport)
とすれば,大人子供別の好きなスポーツのクロス集計表が得られる.
       サッカー 野球
  子供        1    1
  大人        0    3
(2) read.csv( )とほぼ同様の働きをするread.table( )
 read.csv( )は,カンマで区切られたファイル(CSVファイル)を読み込むことを想定した関数であるが,もっと一般のテキストファイルを表形式に読み込む関数read.table( )を使っても,同様の結果を起こせる.
 そもそも,区切り文字をカンマだけに決めてしまうと,小数点(.)の代わりにカンマ(,)やセミコロン(;)を小数点として使う国で困るようだ.また,一般のテキストファイルの場合には,ヘッダ(列見出し:ラベル)がある場合もない場合も起こる.そこで,read.table( )でsep = "," により区切り文字をカンマにすると指定し, header=TRUEにより,第1行を列ラベルとして使用することを指定すると,read.csv( )と同じ結果が得られる.
 さらに,区切り文字として,タブキー,半角スペースが使用されている場合などにも対応できるようになっている.
【例2.2.1】
 次のCSVファイルを,read.csv( )で読み込むと
child,age,寄付金,sport,fruit
大人,35,"1,200",野球,りんご
子供,12,120,サッカー,みかん
大人,26,"3,500",野球,みかん
子供,10,80,野球,みかん
大人,41,500,野球,りんご
 区切り文字のカンマがデータから取り除かれ,カンマをデータとするための文字列ダブルクォートが取れる.また,第1行は列ラベルになる.
  child age 寄付金    sport  fruit
1  大人  35  1,200     野球 りんご
2  子供  12    120 サッカー みかん
3  大人  26  3,500     野球 みかん
4  子供  10     80     野球 みかん
5  大人  41    500     野球 りんご
 これに対して,read.table( )で特に区切り文字,ヘッダの有無を指定せずに読み込むと,先頭にさらに1行V1というラベルが追加され,カンマもデータとして読み込まれる.
                            V1
1 child,age,寄付金,sport,fruit
2  大人,35,"1,200",野球,りんご
3  子供,12,120,サッカー,みかん
4  大人,26,"3,500",野球,みかん
5       子供,10,80,野球,みかん
6      大人,41,500,野球,りんご
 read.table("ファイル名", sep=",", header=TRUE)によって読み込むと
  child age 寄付金    sport  fruit
1  大人  35  1,200     野球 りんご
2  子供  12    120 サッカー みかん
3  大人  26  3,500     野球 みかん
4  子供  10     80     野球 みかん
5  大人  41    500     野球 りんご
と一致する.
 ただし,read.table()はread.csv( )とtable( )の合成ではないので,read.table( )で得られたデータの度数分布表やクロス集計表を求めるには,さらにtable( )を実行しなければならない.

2.3 クロス集計表の留意点
(1) 数値データがあるときの意外な結果
 数値が含まれるデータから度数分布表やクロス集計表を作ると,思いがけず使いにくいものになる.
大・小年齢身長体重
大人13516868.3
大人24117171.2
大人32616567.5
大人43617261.3
大人54118172.5
 右のようなデータがあるときに,年齢,身長,体重のような数値データから度数分布表やクロス集計表を作ると
 • 同じものがほとんどないので,全部並べただけのものができる.
 table(data0$身長, data0$体重)の結果は次のようになる.
      61.3 67.5 68.3 71.2 72.5
  165    0    1    0    0    0
  168    0    0    1    0    0
  171    0    0    0    1    0
  172    1    0    0    0    0
  181    0    0    0    0    1
 このように数値データから成る列データから度数分布表やクロス集計表を作っても,全部の数字を並べているだけで集計らしいものにはならない.
(2) 列数が3個以上ある表に対して,列を指定せずにtable( )関数を用いた場合,「表」として2次元までしか表示できないから,左から2列のクロス集計表を示し,残りの右の列は「すべての組合せを場合分けとして示される」
 例えば,次のCSVファイルをdata1という変数名で読み込んだとき,列は4通りある.
> data1
  性別 スポーツ   果物   朝食
1   男     野球 りんご   パン
2   女 サッカー みかん   パン
3   女     野球 みかん ごはん
4   男     野球 みかん ごはん
5   男 サッカー りんご   パン
 このdata1に対して,単にtable(data1)と入力した場合,第3列,第4列のすべての組合せに対して,第1列×第2列のクロス集計表が表示される.(果物 = りんご, 朝食 = ごはんのような実際には該当者がいない組合せに対しても表示される)
> table(data1)
, , 果物 = みかん, 朝食 = ごはん
    スポーツ
性別 サッカー 野球
  女        0    1
  男        0    1

, , 果物 = りんご, 朝食 = ごはん
    スポーツ
性別 サッカー 野球
  女        0    0
  男        0    0

, , 果物 = みかん, 朝食 = パン
    スポーツ
性別 サッカー 野球
  女        1    0
  男        0    0

, , 果物 = りんご, 朝食 = パン
    スポーツ
性別 サッカー 野球
  女        0    0
  男        1    1
...(PC版)メニューに戻る