Rで度数分布なCSVからヒストグラムを得る

More than 1 year has passed since last update.

rep の存在をすっかり忘れるほどRから遠ざかっていたのでメモ。


以下のような度数分布的なCSVをもらった。
中身がこんな感じのファイルからヒストグラムを得たいらしい。

$ head freqency.csv
var,freq
0,22516
1,199
2,178
3,453
4,175
5,261
6,177
7,196
8,199

変数ごとの頻度がもうすでにあるのでそのまま plot してあげればいいと思いきや、

$ tail freqency.csv
7790,1
7779,1
3834194,1
7688,1
15450,1
38837,1
7726,1
7720,1
30848,1
23264,1

全然ソートされてない上に割と要素数も多い。
ソートぐらいだったら前処理としてやってあげてもよいのだけれどせっかくなので生データをそのまま使う方向で書いてみた。

freq.vec <- function(csv, xs = 0, xe = 0) {
  # 与えられた度数分布のCSVからhist関数に与えるベクトルを取得する
  # 引数:
  #   csv: 1カラム目が変数、2カラム目が頻度となるCSVファイル
  #   xs, xe: それぞれ変数の下限と上限(与えなかった場合は変数の最小値と最大値を利用する)
  # 返り値:
  #   変数値が頻度の数だけ繰り返されたベクトル
  d <- read.csv(csv)
  vars <- d[[1]]
  xs <- ifelse(xs == 0, min(vars), xs)
  xe <- ifelse(xe == 0, max(vars), xe)
  d.ext <- d[vars >= xs & vars <= xe, ]
  rep(d.ext[[1]], d.ext[[2]])
}

今回は外れ値がとてつもなく多かったため変数の幅を狭めるようなことしたけどそうでもなければ
ぶっちゃけこんな関数書くほどでもなく普通に rep すればよいだけ。
実際使うとこんな感じ。

> freq1 <- freq.vec("frequency.csv", xs = 1, xe = 1000)
> hist(freq1, col = "#0000ff40", border = "#0000ff", labels = T, breaks = 20)

Rplot.png

hist で引数 breaks を調節することでいい感じに出力してくれるのはホントありがたいですね。