2010-12-11 5 views
3

Si je vais avoir le vecteur suivant R (évidemment mes niveaux étant A, B et C)moyen le plus rapide pour obtenir vecteur de classe de noms dans R

c("A_1", "A_2", "B_1", "C_1", "C_2") 

ce qui est la façon la plus efficace de transformer à vecteur de classe avec des nombres comme

c(1, 1, 2, 3, 3) 

je me sens comme cela devrait être une ligne unique (probablement une combinaison de facteurs et grep), mais n'a pas pu trouver un.

Merci!

Répondre

5

Une solution simple serait:

x <- c("A_1", "A_2", "B_1", "C_1", "C_2") 


x.out <- as.numeric(factor(substr(x, 0,1))) 

Si vos données sont plus variées, laissez-moi savoir et nous pouvons travailler pour en faire une solution plus robuste.

+0

fonctionne très bien! :-) –

+0

vous pouvez également appeler unclass() ou as.integer() au lieu de as.numeric() sur la sortie de l'appel factor() - il est plus sûr pour les comparaisons et les correspondances si vous voulez faire ce genre de choses plus tard. – hatmatrix

2

Il y a une (plus générale) approche d'expression régulière qui ne nécessiterait pas spécifier la largeur principale chaîne:

Effacez quoi que ce soit démenés et après le trait de soulignement:

> as.numeric(factor(sub("_.+", "" , x))) 
[1] 1 1 2 3 3 

Ou sélectionnez les caractères qui précèdent le trait de soulignement (puisque dans les parties R regex des motifs inclus dans les parenthèses, on peut se référer à la chaîne de remplacement par "\\" suivi d'un chiffre):

> as.numeric(factor(sub("(^.+)_.+$", "\\1" , x))) 
[1] 1 1 2 3 3 
Questions connexes