2011-08-03 17 views
5

Tarihlerim bir veri çerçevem ​​var (Tarih nesnesi); aşağıya bakın. Ben gün haftanın-onları dönüştürmek ve daha sonra bir histogram çizmek çalışıyorum ama ideal ediyorum etiketleri 'Pazartesi' ... 'Pazar' ı iki ayrı sorunları varHaftalık histogram nasıl ve dize etiketleri var

(sayısal olmayan) nerede :

  1. Kolaydır to convert a Date object to day-of-week, ancak sonuç dize veya sayısal değil, bir nesnedir.
  2. Histogram aldığımda, bölmeler ve etiketler yanlıştır (aşağıya bakınız).

Ben weekdays(dat) kullanırsanız, çıktı hist() içinde kullanılamaz dize ("Pazartesi" ...) 'dir.

Alternatif olarak, sayısal verilere dönüştürürsem, dize etiketlerine hist() nasıl girilir?

> 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')) 

Etiketlemeye uygun şekilde çalışmıyor. 0.5 genişlikteki kutularda ne var? Ve ayrıca, Pazar-> 0 ile Pazartesi -> 1 arasında boşluk olmaması nasıl önlenir? İdeal olarak, sütunlar arasında boşluk yok.

My veri benziyor:

> 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 

cevap

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

Güzel, teşekkürler! Çok iyi bir yerleşik olmalı! (Tamsayı verileri için 0,5'te molalar kullanmamı beklemiyordum, bu gerçekten yerleşik olmalı ve sahte yarı genişlikli çubukları önler.) – smci

3

dönüştürme senin bir faktör (kategorik değişkenler için veri türü), ve histogram için (tam sayıya dönüştürür olan) o unclass weekdays(dat). Özel x eksenini oluşturmayı kolaylaştıran faktör sınıfı üzerinde işlemler vardır.

## 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

: varsayılan olarak gün böylece bir faktör çağrısında seviyelerini yeniden düzenlemek zorunda kalacak daha doğal sipariş etmek, alfabetik olarak sıralanmış olacağını

barplot(table(weekdays(dat))) 

Not Tamam teşekkürler. Benim yaklaşımımda, 0.5-genişlikteki kutuları, 0 ('Pazar') & 1 ('Pazartesi') arasındaki boşluk eksikliğini ve hist'ten eşleşmeyen genişlik-0,5 etiketlemesini nasıl elde ederim (label = c ('M') 'Tu', W ', 'th', 'K', 'sa' 'Su'))'? – smci

+0

Kasa genişliklerini kontrol etmek için 'hist' için bir genişlik argümanı vardır; eksen görünümü üzerinde daha fazla kontrol için 'xaxt = 'n'' 'hist' olarak ayarlıyorum ve' axis' ile kendim çizeceğim. – hatmatrix

+0

Vatanın genel bir işlev olduğunu ve sağladığınız ilk bağımsız değişken sınıfına bağlı olarak farklı şeyler yaptığını unutmayın. Yani, örneğinizdeki xxx ve dotw’lere göre değişir. – hatmatrix

4

Bir histogram yerine barplot istediğinden şüpheleniyorum. Günleri saymak için table'u kullanabilirsiniz.

barplot(table(factor(weekdays(dat),levels=c("Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"))))