2012-09-10 4 views
9

Ich habe einen Vektor, der wie folgt aussieht:In R, wie erstelle ich Binned-Faktor-Variablen aus einer kontinuierlichen Variable mit benutzerdefinierten Breaks?

dataset<-c(4,7,9,1,10,15,18,19,3,16,10,16,12,22,2,23,16,17) 

Ich möchte vier Dummy-Kategorien erstellen, in dem ich bin die kontinuierliche Datensatzes durch individuelle Pausen. .. zum Beispiel: 1: 4, 5: 9, 10:17, 18:23.

Die Ausgabe-Dummy-Kategorien würden die gleiche Länge wie das ursprüngliche kontinuierliche Vektor haben (18 in diesem Fall), aber jetzt jedes binned Dummy-Variable wäre nur ein 1 oder ein 0 enthält

Antwort

16

Verwenden cut:

data.frame(dataset, bin=cut(dataset, c(1,4,9,17,23), include.lowest=TRUE)) 
+1

Um von 'cut' zu bekommen Variablen Dummy (das ist, was der OP gefragt), versuchen Sie' model.matrix (~ bin-1, data = Datensatz) ' –

7

Ich stimme mit Joshua, dass ist, was die meisten Menschen für diese Aufgabe denken würde. Ich mag die Standardwerte nicht, bevorzuge Links-Geschlossen-Intervalle, und es ist ein kleiner Schmerz, das richtig einzustellen mit (obwohl es gemacht werden kann. Zum Glück für mein schwaches Gehirn hat Frank Harrell eine cut2 Funktion in sein Hmisc-Paket, dessen Voreinstellungen ich bevorzuge.Eine dritte Alternative ist die Verwendung von findInterval, die besonders für Probleme geeignet ist, bei denen Sie das Ergebnis als Index für einen anderen Extraktions- oder Auswahlprozess verwenden möchten.Sie erhalten ungefähr die Ergebnisse, die Sie erhalten würden, wenn Sie as.numeric anwendeten zu den Ergebnissen der cut:

require(Hmisc) 
cut2(dataset, c(1,4,9,17,23)) 
[1] [ 4, 9) [ 4, 9) [ 9,17) [ 1, 4) [ 9,17) [ 9,17) [17,23] [17,23] [ 1, 4) [ 9,17) 
[11] [ 9,17) [ 9,17) [ 9,17) [17,23] [ 1, 4) [17,23] [ 9,17) [17,23] 

(Beachten Sie, dass findInterval die obere Grenze als das geschlossene Ende verwenden eine zusätzliche Intervall zu bilden, wenn Sie die maximale ersetzen w ith Inf, ein reserviertes Wort für die Unendlichkeit in R.)

findInterval(dataset, c(c(1,4,9,17,23))) 
[1] 2 2 3 1 3 3 4 4 1 3 3 3 3 4 1 5 3 4 
as.numeric(cut(dataset, c(1,4,9,17,Inf), include.lowest=TRUE)) 
[1] 1 2 2 1 3 3 4 4 1 3 3 3 3 4 1 4 3 3 
as.numeric(cut(dataset, c(1,4,9,17,23), include.lowest=TRUE)) 
[1] 1 2 2 1 3 3 4 4 1 3 3 3 3 4 1 4 3 3 
Verwandte Themen