2010-12-11 16 views
3

Wenn ich mit dem folgenden Vektor in R (meine Ebene A offensichtlich zu sein, B und C)schnellster Weg Klassenvektor von Namen in R zu bekommen

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

was ist der effizienteste Weg zu transformieren es Klassenvektor mit Zahlen wie

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

ich fühle mich wie dies einen Einzeiler sein sollte (wahrscheinlich eine Kombination aus Faktor und grep), sondern war mit einem kommen nicht mehr.

Danke!

Antwort

5

wäre eine einfache Lösung:

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


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

Wenn Ihre Daten abwechslungsreicher, lassen Sie mich ist wissen und wir können es sich um eine robustere Lösung arbeiten.

+0

funktioniert super! :-) –

+0

Sie könnten auch unclass() oder as.integer() anstelle von as.numeric() in der Ausgabe von factor() aufrufen - es ist sicherer für Vergleiche und Vergleiche, wenn Sie solche Sachen machen wollen später. – hatmatrix

2

Es gibt einen (allgemeinere) regulären Ausdruck Ansatz, der die Breite der Angabe führender Zeichenkette nicht erfordern würde:

Entweder löschen etwas incuding und nach dem Unterstrich:

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

Oder die Zeichen auszuwählen, die vorangehen der Unterstrich (da in den R-Regex-Abschnitten der Muster, die in Parens eingeschlossen sind, in der Ersetzungszeichenfolge durch "\\" gefolgt von einer Ziffer bezeichnet werden kann):

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