LoginSignup
4
5

More than 5 years have passed since last update.

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

Last updated at Posted at 2014-07-21

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 を調節することでいい感じに出力してくれるのはホントありがたいですね。

4
5
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
5