2010-03-24 7 views
10

J'ai un vecteur X qui contient des nombres positifs que je veux bin/discrétiser. Pour ce vecteur, je veux que les nombres [0, 10] apparaissent tels qu'ils existent dans le vecteur, mais les nombres [10, ∞] soient 10+.Binning une variable numérique dans R

J'utilise:

x <- c(0,1,3,4,2,4,2,5,43,432,34,2,34,2,342,3,4,2) 
binned.x <- as.factor(ifelse(x > 10,"10+",x)) 

mais cela se sent klugey pour moi. Est-ce que quelqu'un connaît une meilleure solution ou une approche différente?

+1

Qu'est-ce que c'est? Cela me semble très bien. –

+2

@Rob: Le principal inconvénient de cette approche est que vous n'obtenez pas de niveaux de facteur créés pour des valeurs qui n'y sont pas (par exemple, pour ces données, il n'y a pas de niveau "6"). Cela pourrait être corrigé avec des niveaux explicites dans l'appel à 'factor'. –

Répondre

17

Que diriez-vous cut:

binned.x=cut(x, breaks=c(-1:9,Inf), labels=c(as.character(0:9),'10+')) 

Ce qui donne:

[1] 0 1 3 4 2 4 2 5 10+ 10+ 10+ 2 10+ 2 10+ 3 4 2 
Levels: 0 1 2 3 4 5 6 7 8 9 10+ 
+1

Cela semble plus compliqué que la solution dans la question. –

+1

Améliorations mineures: Échange '1e6' avec' Inf'. Vous n'avez pas besoin de 'include.lowest = TRUE'. (Comparez les réponses en appelant 'table (binned.x)' –

+0

@Rob: Oui, je ne peux pas dire que je ne suis pas d'accord :) @Richie: Merci! J'apprends toujours la langue, donc vos "améliorations mineures" sont une aide majeure pour moi. – unutbu

7

Vous question est incompatible.
Dans la description 10 appartient au groupe "10+", mais dans le code 10 est le niveau séparé. Si 10devrait être dans le « 10+ » code de groupe, alors vous devriez être

as.factor(ifelse(x >= 10,"10+",x)) 

Dans ce cas, vous pouvez tronquer les données à 10 (si vous ne voulez pas un facteur):

pmin(x, 10) 
# [1] 0 1 3 4 2 4 2 5 10 10 10 2 10 2 10 3 4 2 10 
2
x[x>=10]<-"10+" 

Cela vous donnera un vecteur de chaînes. Vous pouvez utiliser as.numeric(x) pour convertir en nombre ("10+" devient NA), ou as.factor(x) pour obtenir votre résultat ci-dessus.

Notez que cela va modifier le vecteur d'origine lui-même, vous pouvez donc vouloir copier vers un autre vecteur et travailler dessus.

Questions connexes