2011-08-03 6 views
5

データフレームの日付(Dateオブジェクト)があります。下を見てください。 私は、を曜日に変換して、ヒストグラムを描画しようとしているが、理想的だラベルは「月曜日」... '日曜日、私は二つの異なる問題を抱えている曜日をヒストグラムにする方法と文字列ラベルを使用する

(数値ではない)しているところ:

  1. to convert a Date object to day-of-weekですが、結果は文字列または数値であり、オブジェクトではありません。
  2. ヒストグラムを取得すると、ビンとラベルが間違っています(下記参照)。

weekdays(dat)を使用した場合、出力はhist()で使用できない文字列( "Monday" ...)です。

数値データに変換すると、hist()に文字列ラベルを取得する方法はありますか?

> dotw <- with(month.day.year(dat[,1]), day.of.week(month,day,year)) 
> hist(xxx,labels=c('M','Tu','W','Th','F','Sa','Su'),col='black') # WTF?! 
> hist(dotw,xlab=list('M','Tu','W','Th','F','Sa','Su')) 

ラベリングのために意図されたとおりに機能しません。 0.5幅のビンには何がありますか?また、日曜日 - > 0と月曜日 - > 1の間のギャップの欠如を防ぐ方法は?理想的には、列間には隙間がありません。

> dat 
    [1] "2010-04-02" "2010-04-06" "2010-04-09" "2010-04-10" "2010-04-14" "2010-04-15" "2010-04-19" 
    [8] "2010-04-21" "2010-04-22" "2010-04-23" "2010-04-26" "2010-04-28" "2010-04-29" "2010-04-30" 
... 

> str(dat) 
Date[1:146], format: "2010-04-02" "2010-04-06" "2010-04-09" "2010-04-10" "2010-04-14" "2010-04-15" ... 

> str(weekdays(dat)) 
chr [1:146] "Friday" "Tuesday" "Friday" "Saturday" "Wednesday" "Thursday" "Monday" ... 
> hist(weekdays(dat)) 
Error in hist.default(weekdays(dat)) : 'x' must be numeric 

答えて

7
dat <- as.Date(c("2010-04-02", "2010-04-06", "2010-04-09", "2010-04-10", "2010-04-14", 
     "2010-04-15", "2010-04-19", "2010-04-21", "2010-04-22", "2010-04-23","2010-04-24", 
     "2010-04-25", "2010-04-26", "2010-04-28", "2010-04-29", "2010-04-30")) 
dwka <- format(dat , "%a") 
dwka 
# [1] "Fri" "Tue" "Fri" "Sat" "Wed" "Thu" "Mon" 
# [8] "Wed" "Thu" "Fri" "Sat" "Sun" "Mon" "Wed" 
# [15] "Thu" "Fri" 
dwkn <- as.numeric(format(dat , "%w")) # numeric version 
hist(dwkn , breaks= -.5+0:7, labels= unique(dwka[order(dwkn)])) 

enter image description here

+0

美しい、ありがとう!だから、それは組み込みでなければならない! (私は整数データのために0.5でブレークを使用することは期待していないでしょう、それは本当に組み込まれ、偽の半角のバーを防ぐべきです)。 – smci

3

ヒストグラムのために(整数に変換されます)あなたのweekdays(dat)因子(カテゴリ変数のデータ型)に変換し、それをunclass:

私のデータは次のようになります。カスタムX軸の作成を容易にするファクタクラスの操作があります。

## days of the week 
days <- c('Sun','Mon','Tues','Wed','Thurs','Fri','Sat') 

## sample with replacement to generate data for this example 
samples <- sample(days,100,replace=TRUE) 

## convert to factor 
## specify levels to specify the order 
samples <- factor(samples,levels=days) 

hist(unclass(samples),xaxt="n") 
axis(1,at=1:nlevels(samples),lab=levels(samples)) 
box() 
+0

ありがとう。私のアプローチでは、0(日曜日)と1(月曜日)の間にギャップがなく、hist(ラベル= c( 'M') 、 'T'、 'W'、 'Th'、 'F'、 'Sa'、 'Su')) '? – smci

+0

ビンの幅を制御するために 'hist'に幅の引数があります。軸の外観をより完全に制御するために、 'hist 'に' xaxt = "n"を設定し、 'axis'で私自身を描画します。 – hatmatrix

+0

histは汎用関数であり、提供する最初の引数のクラスによって異なることに注意してください。したがって、あなたの例で 'xxx'と' dotw'が何であるかによって異なります。 – hatmatrix

4

ヒストグラムではなくbarplotと思っています。 を使用して日数をカウントできます。

barplot(table(weekdays(dat))) 

デフォルトでは日がそれを注文するより自然にあなたが要因呼び出しでレベルの順序を変更する必要がありますが、アルファベット順にソートされることに注意してください:

barplot(table(factor(weekdays(dat),levels=c("Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday")))) 
関連する問題