2011-06-04 6 views
11

tengo datos en R que puede tener este aspecto:Expresiones regulares en R para borrar todos los caracteres después del primer espacio?

USDZAR Curncy 
R157 Govt 
SPX Index 

En otras palabras, una palabra, en este caso un identificador de seguridad Bloomberg, seguida por otra palabra, que es la clase de seguridad, separadas por un espacio . Quiero quitar la clase y el espacio para llegar a:

USDZAR 
R157 
SPX 

¿Cuál es la forma más eficiente de hacer esto en R? ¿Son expresiones regulares o debo hacer algo como lo haría en MS Excel usando los comandos mid y find? por ejemplo, en Excel diría:

=MID(@REF, 1, FIND(" ", @REF, 1)-1) 

lo que significa devolver una subcadena a partir del carácter 1, y terminando en el número de caracteres del primer espacio (menos 1 para borrar el espacio real).

¿Tengo que hacer algo similar en R (en cuyo caso, cuál es el equivalente), o pueden ayudar las expresiones regulares aquí? Gracias.

Respuesta

23

1) probar este donde la expresión regular coincide con un espacio seguido por cualquier secuencia de caracteres y sub sustituye a que con una cadena que tiene cero caracteres:

x <- c("USDZAR Curncy", "R157 Govt", "SPX Index") 
sub(" .*", "", x) 
## [1] "USDZAR" "R157" "SPX" 

2) una alternativa si quería las dos palabras en columnas separadas en un marco de datos son las siguientes. Aquí as.is = TRUE hace que las columnas sean carácter en lugar de factor.

read.table(text = x, as.is = TRUE) 
##  V1  V2 
## 1 USDZAR Curncy 
## 2 R157 Govt 
## 3 SPX Index 
+0

Fantástico gracias. –

1

La expresión regular sería la de buscar:

\x20.* 

y reemplazar con una cadena vacía.

Si desea saber si es más rápido, simplemente hágalo.

+0

Gracias, justo lo que estoy escribiendo: ("\ x20 *", "R157 Gobierno")> grep y estoy volviendo: [1] 1, es decir, el valor 1. ¿A dónde voy desde allí? –

+0

este tipo de expresiones regulares no funciona bien con R. –

+0

El problema con ese uso fue que no entendió que la barra diagonal inversa es especial en expresiones regulares y por lo tanto debe ser "escapada". Y necesita tener DOS baackslashes antes cuando está en el argumento de patrón. Pruebe: 'sub (" \\\ x20. * "," "," R157 Govt ")' –

2

Si eres como yo, en la que la expresión regular seguirá siendo siempre un misterio inescrutable, frustrante, esta solución también existe clunkier:

x <- c("USDZAR Curncy", "R157 Govt", "SPX Index") 
unlist(lapply(strsplit(x," ",fixed=TRUE),"[",1)) 

El fijo = TRUE no es estrictamente necesario, simplemente señalando que puedes hacer esto (caso simple) sin saber realmente lo primero sobre las expresiones regulares.

Editado para reflejar el comentario de @ Wojciech.

+0

jaja sí - gracias joran. El estilo de clunk es lo que estoy acostumbrado en Excel, por lo tanto, me preguntaba si debería (finalmente) aprender regex. –

+0

función anónima no es necesaria aquí, por lo que puede simplificar para deslistar (aplicar (strsplit (x, "", fijo = VERDADERO), "[", 1)]. –

+0

Gracias @Wojciech, voy a editar en consecuencia ... – joran

4

Es bastante fácil con stringr:

x <- c("USDZAR Curncy", "R157 Govt", "SPX Index") 

library(stringr) 
str_split_fixed(x, " ", n = 2)[, 1] 
Cuestiones relacionadas