2010-04-15 7 views
9

J'ai une base de données avec une colonne d'entiers que je voudrais utiliser comme référence pour créer une nouvelle variable catégorielle. Je veux diviser la variable en trois groupes et définir les plages moi-même (c'est-à-dire 0-5, 6-10, etc.). J'ai essayé cut mais cela divise la variable en groupes basés sur une distribution normale et mes données sont faussées. J'ai aussi essayé d'utiliser les instructions if/then, mais cela renvoie une valeur true/false et j'aimerais conserver ma variable d'origine. Je suis sûr qu'il existe un moyen simple de le faire, mais je n'arrive pas à le comprendre. Des conseils sur un moyen simple de le faire rapidement?Créer une variable catégorielle en R basée sur la plage

j'avais quelque chose à l'esprit comme ceci:

x x.range 
3 0-5 
4 0-5 
6 6-10 
12 11-15 

Répondre

12

Réponse de Ian (coupé) est la façon la plus courante de le faire, pour autant que je sache.

Je préfère utiliser bardeaux, du treillis Paquet

l'argument qui spécifie les intervalles de binning me semble un peu plus intuitive.

vous utilisez bardeaux comme ceci:

# mock some data 
data = sample(0:40, 200, replace=T) 

a = c(0, 5);b = c(5,9);c = c(9, 19);d = c(19, 33);e = c(33, 41) 

my_bins = matrix(rbind(a, b, c, d, e), ncol=2) 

# returns: (the binning intervals i've set) 
     [,1] [,2] 
[1,] 0 5 
[2,] 5 9 
[3,] 9 19 
[4,] 19 33 
[5,] 33 41 

shx = shingle(data, intervals=my_bins) 

#'shx' at the interactive prompt will give you a nice frequency table: 
# Intervals: 
    min max count 
1 0 5 23 
2 5 9 17 
3 9 19 56 
4 19 33 76 
5 33 41 46 
+1

solution de Nice si vous dérange pas de mettre en place une matrice de valeurs min et max. Cela peut être fastidieux si vous avez une plage dynamique. –

+0

@ Roman, je pensais exactement à ce sujet. J'ai un problème similaire avec des plages dynamiques. Avez-vous des suggestions sur la façon de procéder dans ce cas? – PikkuKatja

16
x <- rnorm(100,10,10) 
cut(x,c(-Inf,0,5,6,10,Inf)) 
Questions connexes