2012-10-25 17 views
8

pracuję z funkcją cięcia, aby przygotować dane dla histogramu barplot ale biec w pozornej sprzeczności między moimi etykiet i przerw:Cut i etykiety/długość przerw konflikt

Error in cut.default(sample(1:1e+05, 500, T), breaks = sq, labels = sprintf("$%.0f", : labels/breaks length conflict

Oto przykład . Udaję, że są to dane o dochodach, wykorzystujące sekwencję od 0 do 100 000 USD w koszach o wartości 10 000 USD. Używam tej samej zmiennej do generowania zarówno przerw, jak i etykiet, z niewielkim formatowaniem po stronie etykiety. Pomyślałem, że z jakiegoś powodu mogą mieć różną długość w porównaniu do wektora postaci, ale wydają się mieć tę samą długość, nadal.

> sq<-seq(0,100000,10000) 
> cut(sample(1:100000, 500, T),breaks=sq,labels=sprintf("$%.0f",sq)) 
> length(sprintf("$%.0f",sq)) 
[1] [11] 
> length(sq) 
[1] [11] 

EDIT:

Per @thelatemail i sugestie @Josh O'Briena, zmieniłem kod do tego i rzeczy są sprawne. cut(sample(1:100000, 500, T),breaks=sq,labels=sprintf("$%.0f",sq[-1]))

+1

'długości (tabela (rozcięcie (przykładowy (1: 100000, 500, T), przerwy = kw)))' jest '10', a tym samym swoją niedopasowanie. – thelatemail

+0

Jeśli końcowy wynik będzie histogramem, dlaczego po prostu nie użyjesz parametru 'breaks' do funkcji' hist() '? –

+0

Tak właśnie zrobiłem. Ale byłem ciekawy, dlaczego nie mogę rozwiązać problemu "cut". – ako

Odpowiedz

18

Z cut(), 11 przerw ogranicza maksymalnie 10 poziomów, które będą wymagać tylko 10 etykiet. Błąd "labels/breaks length conflict" informuje, że wywołanie sprintf() dostarcza jeden zbyt wiele etykiet do argumentu labels=.

W kodzie:

breaks <- 0:10/10 
dat <- runif(1e4) 

length(breaks) 
# [1] 11 
length(levels(cut(breaks, sq))) 
# [1] 10 
+2

Ładne i jasne. O dziwo, [nie tak jasny dokument dla 'cut()'] (https://stat.ethz.ch/R-manual/R-devel/library/base/html/cut.html) nie mówi gdziekolwiek * "jeśli' breaks' jest wektorem, to 'labels' musi być wektorem o długości jednej mniejszej niż' breaks' "*. Czuję, że nadchodzi docbug. – smci