2016-06-18 21 views
0

mir folgendes inkonsistentes Verhalten von cut begegnet, die mir Kopfschmerzen gibt:inkonsistentes Verhalten von `cut`: Verschiedene Intervalle mit dem gleichen Anzahl und gleichen angezeigten Schnittpunkten

x <- 0.2316 
cut(x, c(0, 0.2315, 10)) #gives 0.232 as cutpoint and choses second interval 
## [1] (0.232,10] 
## Levels: (0,0.232] (0.232,10] 
cut(x, c(0, 0.232, 10)) #choses first interval when taking the same cutpoint it just gave (0.232) 
## [1] (0,0.232] 
## Levels: (0,0.232] (0.232,10] 

Das Problem ist, dass cut die wählen scheint Intervall vor dem Formatieren (Runden) der Schnittpunkte. Dies führt zu dem inkonsistenten Verhalten im Beispiel, dass es das zweite Intervall wählt, aber das erste Intervall entsprechend dem gegebenen Schnittpunkt gewählt hätte (was in der letzten Zeile zu sehen ist).

Das ist ein Problem für mich, weil ich zwei Funktionen in meinem Paket habe: Einer berechnet die Schnittpunkte und der zweite bestimmt die richtigen Intervalle, wo neue Datenpunkte eingefügt werden. Im obigen Beispiel wird der gleiche Datenpunkt in das zweite Intervall in der ersten Funktion, aber in das erste Intervall in der zweiten Funktion eingefügt - die exakt gleichen Schnittpunkte werden angezeigt! Das kann zu seltsamen Verhaltensweisen in meinem Paket führen!

Meine Frage
Ist dies ein bekanntes Problem? Und wenn ja, gibt es Workarounds? Danke

bearbeiten
Ich weiß, dass Sie die Anzahl der Dezimalstellen mit dig.lab noch das gleiche Problem würde auftreten, ändern können, wenn Sie Schnittpunkte mit mehr Dezimalstellen hatte. Das obige Beispiel ist nur eine Demonstration eines allgemeineren Problems!

+1

Möchten Sie mehr Ziffern für die Schnittpunkte? Das wäre "cut (x, c (0, 0.2315, 10), dig.lab = 4)". – lukeA

+0

@lukeA: Ich weiß, aber das gleiche Problem würde eine Dezimalstelle weiter unten auftreten, wenn Sie eine Zahl mit mehr Dezimalstellen als Schnittpunkt hatten. Das obige ist nur ein illustratives Beispiel! – vonjd

+0

@lukeA: Bitte sehe meine Bearbeitung. – vonjd

Antwort

0

Ich hatte nur einen Blick auf den Quellcode cut.default und ich denke, ein Problem zu umgehen die gleiche Formatierung anzuwenden wäre, die auf dem Ausdruck auf dem breaks vor dem Aufruf der cut Funktion angewendet wird: Dann

breaks <- as.numeric(formatC(0 + c(0, 0.2315, 10), digits = 3, width = 1L)) 
cut(x, breaks = breaks) 
## [1] (0,0.232] 
## Levels: (0,0.232] (0.232,10] 

zumindest ist alles konsistent (in diesem Fall wird in beiden Fällen das erste Intervall gewählt).

Dies funktioniert jedoch nur in Fällen, in denen Sie die Schnittpunkte explizit festlegen!