2012-02-03 12 views
9

私は、次のような形式を持つデータフレームを持っている:Rの集計データからヒストグラムを作成するにはどうすればよいですか?

Month  Frequency 
2007-08  2 
2010-11  5 
2011-01  43 
2011-02  52 
2011-03  31 
2011-04  64 
2011-05  73 

私は(Xは、おそらく約15になりますが、実際のデータを持っているXビンを使用して、このデータからヒストグラムを作成したいですヒストグラムの各ビンの頻度として頻度列からのデータを使用して、どうすればこれを達成できますか?

これまで、hist()とbarplot()コマンドを使って2つのアプローチを試しました。 hist()の問題は、ヒストグラムの頻度計算で周波数列を使用するよう指定する方法がないように見えることです。 barplot()の問題は、私がXビンを選択する際に柔軟性がないことです。x軸が連続していないため、結果のグラフは実際のヒストグラムではありません。

今私が持っている唯一のアイデアは、barplot()アプローチを使い、Frequencyの値が0の欠落月を記入し、スペース= 0を使用してバーの間隔を取り除くことです。その問題は、任意の数のビンを選択することが特に簡単ではないということです。

答えて

4

は、柔軟性のこの種を取得するには、あなたがあなたのデータを複製する必要があります。ここrepでそれを行うための一つの方法は次のとおりです。

n <- 10 
dat <- data.frame(
    x = sort(sample(1:50, n)), 
    f = sample(1:100, n)) 
dat 

expdat <- dat[rep(1:n, times=dat$f), "x", drop=FALSE] 

今、あなたはあなたがビンの異なる数でhistを呼び出すことができるように、data.frame expdatに複製データを持っている:

par(mfcol=c(1, 2)) 
hist(expdat$x, breaks=50, col="blue", main="50 bins") 
hist(expdat$x, breaks=5, col="blue", main="5 bins") 
par(mfcol=c(1, 1)) 

enter image description here

+1

私が質問したとき、私は単純な例ではなく、私の周波数が実際には1億から5千万以上に及んでいると言わなかったので、私はそれをあまりにも単純化しました。これらの周波数は高すぎて、私のマシン(8 GB RAM)の生データに 'rep'を使用できませんでした。これらの周波数を私の目的のために十分なヒストグラム(確率分布)を与えたより小さなスケール(1〜100,000)に変換しました。私は一般的にあなたの答えが好きです、そして、これまで私が "本当の"ヒストグラムを与える私が見つけた唯一の解決策です。ありがとう! –

+0

あなたの頻度が高すぎる場合は、 expdat < - dat [rep(1:n、times = dat $ f/1000)、 "x"、drop = FALSE]のように周波数係数を単純に小さくすることができます – Marian

4

ggplot2で逃亡する。

あなたのデータはdfと呼ばdata.frameにある場合:

ggplot(df,aes(x=Month,y=Frequency))+geom_bar(stat='identity') 

たり、連続時間をしたい場合:

df$Month<-as.POSIXct(paste(df$Month, '01', sep='-'),format='%Y-%m-%d') 
ggplot(df,aes(x=Month,y=Frequency))+geom_bar(stat='identity') 
+0

私は2番目の例を試してみると、ggplotコマンドを実行すると 'Error:非連続変数がscale_y_continuousに供給されました。 'というメッセージが表示されます。何か案は? –

+0

私はあなたのデータについてもっと知る必要があります。あなたの 'Frequency'が数値でないと仮定します。データを再作成すると、 'df <-data.frame(月= c( '2007-08'、 '2010-11'、 '2011-01'、 '2011-02'、 '2011-03'、 '2011 -04 '、' 2011-05 ')、頻度= c(2,5,43,52,31,64,73))です。これらの2つのコマンドでうまくプロットします。あなたのデータの 'str'をチェックし、yの連続変数を供給していることを確認してください。 – Justin

+0

私は月の列をDate型に変換することで、2番目の例の仕事を得ました。これは私が望むものに近いですが、理想的には、私はより少ない容器を持っています。これは、個々の日付ごとにバー(事実上ビン)を与えているようです。_Edit_:私はあなたの上記のコメントを見ました。それに対処するために私の質問を更新させてください。 –

3

Yea、repソリューションは、最も興味深い/大きなケースでは、あまりにも多くのメモリを無駄にします。 HistogramTools CRANパッケージには効率的なPreBinnedHistogram関数が含まれており、提供された元の質問と同様に、ビンとブレークのリストから直接ベースRのヒストグラムオブジェクトを作成します。

+0

ありがとうございます、これは本当に便利でした。唯一の失望は、関数が 'breaks'、' counts'、 'xnames'などの引数を取るだけなので、おそらく他の設定で回り込んでいくことは、後で行う必要があるということです。ヒストグラムが最初に構築されたときに 'axes = FALSE'を設定するのではなく、' plot(myhist、axes = FALSE) '誰かが出力がどのように見えるかを見たい場合、この答えでこのようにしてヒストグラムを作成しました:http://stats.stackexchange.com/a/122853/22228 – Silverfish

0

もう1つの可能性は、担当者にできるだけ多くの作業をさせることがないように、大きな変数で頻度変数をスケールダウンすることです。次に、ヒストグラムの縦軸スケールを同じ係数で調整します。

関連する問題