Ich habe eine kontinuierliche Variable, die ich in Bins aufteilen möchte und einen numerischen Vektor (mit der Länge meines ursprünglichen Vektors) zurückgibt, dessen Werte sich beziehen zu den Werten der Behälter. Jeder Behälter sollte ungefähr die gleiche Anzahl von Elementen haben. Diese Frage: splitting a continuous variable into equal sized groups beschreibt eine Reihe von Techniken für verwandte Situationen. Zum Beispiel, wenn ich anfangen miteine kontinuierliche Variable in Gruppen mit gleicher Anzahl von Elementen aufteilen - numerischen Vektor aus Bin-Werten zurückgeben
x = c(1,5,3,12,5,6,7)
ich cut()
können erhalten:
cut(x, 3, labels = FALSE)
[1] 1 2 1 3 2 2 2
Dies ist unerwünscht, weil die Werte des Faktors nur sequenzielle ganze Zahlen sind, haben sie keine direkte Beziehung zu dem zugrunde liegenden ursprüngliche Werte in meinem Vektor.
Eine andere Möglichkeit ist cut2
: zum Beispiel:
library(Hmisc)
cut2(x, g = 3, levels.mean = TRUE)
[1] 3.5 3.5 3.5 9.5 3.5 6.0 9.5
Dieses besser, weil jetzt die Rückgabewerte auf die Werte der Bins beziehen. Es ist immer noch weniger als ideal, obwohl seit:
- (a) es einen Faktor ergibt, die dann in numerischem konvertiert werden muss (siehe e.g.), die wiesen beide langsam und umständlich Code ist.
- (b) Idealerweise würde ich gerne wählen können, ob die oberen oder unteren Endpunkte der Intervalle verwendet werden, anstatt nur die Mittel.
Ich weiß, dass es auch Optionen regex auf die Faktoren, Erträge aus cut
oder cut2
mit den oberen oder unteren Punkte der Intervalle zu erhalten. Auch diese scheinen übermäßig schwerfällig.
Ist dies nur eine Situation, die einige nicht so elegante Hacking erfordert? Oder gibt es eine einfachere Funktionalität, um dies zu erreichen?
Mein aktueller Best-Effort ist wie folgt:
MyDiscretize = function(x, N_Bins){
f = cut2(x, g = N_Bins, levels.mean = TRUE)
return(as.numeric(levels(f))[f])
}
Mein Ziel ist es, etwas schneller zu finden, die mehr elegant und leicht anpassbar entweder der Endpunkte zu verwenden, anstatt nur die Mittel.
Edit:
Zur Klarstellung: meine gewünschte Ausgabe wäre:
(a) ein Äquivalent zu dem, was ich jetzt im Beispiel mit
cut2
erreichen können, aber ohne Sie müssen den Faktor in numerisch konvertieren.(b) Wenn möglich, können Sie auch einfach einen der Endpunkte des Intervalls anstelle des Mittelpunkts verwenden.
Ok, danke, das ist hilfreich, sowohl die Funktion als auch die Notiz. Ich mag schlampig in meiner Terminologie gewesen sein, - 'cut2' ist eine Möglichkeit, Bins mit * relativ * gleichen Zahlen von Elementen zu erhalten, oder? –
Nicht wirklich, wenn Sie sich das Ergebnis von 'cut2' ansehen, enthält die erste Gruppe vier Elemente, das zweite nur eins und die letzten zwei. Funktion 'cut' garantiert nicht, dass jede Gruppe die gleiche Anzahl von Elementen hat. –
Wenn Sie die gleiche Anzahl an Elementen haben möchten, sollten Sie sie bestellen und dann in gleich große Gruppen aufteilen. –