2011-08-03 19 views
5

Mam ramkę danych dat (obiekt Date); patrz na dole. Próbuję przekonwertować je na dzień-of-tygodnia, a następnie narysować histogram, ale idealnie gdzie etykiety są „Monday” ... „Niedzieli” (nie numerycznie)Jak histogram dzień tygodnia i mieć etykiety ciągów znaków

Mam dwa odrębne problemy :

  1. To proste to convert a Date object to day-of-week, ale wynikiem jest ciąg lub numeryczna, a nie obiekt.
  2. Po uzyskaniu histogramu, pojemniki i etykiety są nieprawidłowe (patrz poniżej).

Jeśli używam weekdays(dat), wyjście jest ciągiem znaków ("Monday" ...), którego nie można użyć w hist().

Alternatywnie, jeśli mogę przekonwertować dane numeryczne, jak uzyskać etykiety ciągów na 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')) 

Nie działa zgodnie z przeznaczeniem do opisywania. Co się dzieje z pojemnikami o szerokości 0,5? A także, jak zapobiegać brakowi przerwy między niedzielą-> 0 a poniedziałkiem-> 1? Idealnie, bez luk między kolumnami.

Moje dane wygląda następująco:

> 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 

Odpowiedz

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

Piękna, dziękuję! Tak dobrze, powinno być wbudowane! (Nie spodziewałem się używać przerw na 0.5 dla danych całkowitych, które naprawdę powinny być wbudowane i zapobiegać fałszywym półkom szerokości). – smci

3

konwertować weekdays(dat) aby czynnik (typ danych dla zmiennych kategorycznych) i unclass nim (który konwertuje do liczby całkowitej) na histogramie. Istnieją operacje na klasie czynników, które ułatwiają tworzenie niestandardowej osi 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

Ok dzięki. W moim podejściu, dlaczego otrzymuję pojemniki o szerokości 0,5, brak odstępu między 0 ("Niedziela") i 1 ("Poniedziałek"), a etykietą "niedopasowane-szerokość-0,5" z 'hist (etykiety = c (" M ") , "Tu", "W", "Th", "F", "Sa", "Su")) "? – smci

+0

Istnieje argument szerokości dla 'hist', aby kontrolować szerokości bin; dla pełniejszej kontroli nad wyglądem osi ustawiłbym 'xaxt =" n "' w 'hist' i narysowałbym własną za pomocą' osi'. – hatmatrix

+0

Należy zauważyć, że hist jest funkcją ogólną i robi różne rzeczy w zależności od klasy pierwszego podanego argumentu. Zależy więc od tego, jakie 'xxx' i' dotw' w twoim przykładzie są. – hatmatrix

4

Podejrzewam, że chcesz raczej barplot niż histogramu. Możesz użyć numeru table, aby policzyć dni.

barplot(table(weekdays(dat))) 

Należy pamiętać, że domyślnie dni będą sortowane alfabetycznie, więc zamówić ją bardziej naturalnie trzeba będzie zmienić kolejność poziomów w rozmowie czynnika:

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