Rで『身近な統計(’12)』 – 図表2-4 度数分布表
第2章の巻末の度数分布表に似た内容のデータフレームを作ってみました。内容は以下の通りです。日本語では、環境によって、正しく表示されない場合もありますので、アルファベットにしています。
作りたいテーブル
| grade | freq | cum_freq | rel_freq | cum_rel_freq |
|---|---|---|---|---|
| A | 10 | 10 | 0.25 | 0.25 |
| B | 16 | 26 | 0.40 | 0.65 |
| C | 10 | 36 | 0.25 | 0.90 |
| D | 4 | 40 | 0.10 | 1.00 |
ソース
変数に値を代入して、計算し、いくつかの方法で、データフレームに追加しているだけです。このデータは次回にも使うので、最期にファイルに保存しています。
実行結果
freq_tableの中身を確認してみます。以下のように表示されます。
> freq_table
grade freq cum_freq rel_freq cum_rel_freq
1 A 10 10 0.25 0.25
2 B 16 26 0.40 0.65
3 C 10 36 0.25 0.90
4 D 4 40 0.10 1.00
説明
動作や変数の内容の変化を確認したい方は、環境のペインに表示されている変数を全て消去してから、ソースエディタ上の[Run]で、1行ずつ実行してみてください。
4行目,5行目
grade <- c("A", "B", "C", "D") # 成績
freq <- c(10, 16, 10, 4) # 度数
ここでは、変数に値を入れています。Rでの代入は”<-“です。”=“も使えますが、関数のオプションとの区別するために、”<-“とすることが推奨されています。
c(...)は、複数の要素(要素が数値なら「複数の数値」、文字なら「複数の文字」)をまとめて、ベクトルにする関数です。
“#“以後はコメントです。関数の実行などには影響しません。後で自分が見たり、他の人が見たりしたときに、何をしているのかがわかるように入れます。
7行目
freq_table <- data.frame(grade, freq) # データフレームにします。
次に、data.frame(...)で、2つのベクトルをまとめて、データフレームを作り、freq_tableに代入します。データフレームとは、Rでよく使われるデータ構造で、異なる型のデータを一つにまとめたものです。2次元配列のようですが、特別なリストです。
ここでは、freq_tableの内容は以下のようになっています。左側に行番号がつき、変数名が列の名前になっていることが確認できます。
> freq_table
grade freq
1 A 10
2 B 16
3 C 10
4 D 4
この後さらに、複数の方法で、データフレームに列を追加していきます。
10行目
freq_table <- transform(freq_table, cum_freq = cumsum(freq)) # 累積度数を追加
transform(x, y = value)は、データフレームに列を追加したり、既にある列のデータを変更したりする関数です。xに指定した名前yがあれば、y列をvalueに入れ替え、名前yがなければy列を追加し、valueとします。
> transform(freq_table, grade = 1:4) # gradeの"A"~"D"を1~4に入れ替え
grade freq
1 1 10
2 2 16
3 3 10
4 4 4
> transform(freq_table, mijika = seq(2, 8, 2)) # mijikaという名前の列を追加
grade freq mijika
1 1 10 2
2 2 16 4
3 3 10 6
4 4 4 8
cumsum(x)は、xの累積和を返します。
> cumsum(1:10)
[1] 1 3 6 10 15 21 28 36 45 55
11行目
freq_table <- cbind(freq_table, rel_freq = freq / sum(freq)) # 相対度数を追加
cbind(x, y) または cbind(x, y = value)は列方向(横方向)にxとyを結合します。cbind(x, y)はyが列の名前になります。cbind(x, y = value)では名前y、値valueの列が追加されます。
rel_freq <- freq / sum(freq)
freq_table <- cbind(freq_table, rel_freq)
としても結果は同じになります。
sum(x)は、和を返します。
> sum(1:10)
[1] 55
12行目
freq_table$cum_rel_freq <- freq_table$cum_freq / sum(freq) # 累積相対度数を追加
x$yで、データフレームxのy列を操作できます。データフレームxが存在していて、その中にy列が存在していない場合に、x$yに代入すると、y列が追加されて代入されます。ただし、データフレームxがない場合には、エラーになります。
> x$y <- 1:4
x$y <- 1:4 でエラー: オブジェクト 'x' がありません
> x <- data.frame(a = 1:4)
> x$y <- rep(0.1, 4)
> x
a y
1 1 0.1
2 2 0.1
3 3 0.1
4 4 0.1
> x$a
[1] 1 2 3 4
> x$y
[1] 0.1 0.1 0.1 0.1
14行目
write.csv(freq_table, "chapter02_4.csv", row.names = FALSE) # テーブルを保存
データはこの後も使うので、保存しておきます。row.names = FALSEで、左側の行番号を保存しないように指定しています。
