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
で、左側の行番号を保存しないように指定しています。