2012-01-03 28 views
5

Tengo una columna en un marco de datos donde los valores son combinaciones de números de letras como G1, K8, A132, etc. Quiero dividir la letra del número pero retener el número como un solo número. He estado usando strsplit pero esto da una lista de valores como se verá más adelante, donde me liek a tener la salida de G y 10:dividir un carácter de un número con varios dígitos

x <- "G10" 
strsplit(x, "")[[1]][1] 
"G" 
strsplit(x, "")[[1]][-1] 
"1" "0" 

esto lleva a los problemas aguas abajo predecibles cuando trato de usar los números números. Aquí es un ejemplo paste donde me gustaría llegar "somethingelse_10":

z <-strsplit(x, "")[[1]][-1] 
paste("somethingelse",z, sep="_") 
"somethingelse_1" "somethingelse_0" 

¿Hay una manera fácil de dividir el número de cartas?

+0

es el formato siempre una sola letra seguida de un número? – Dason

+1

en este caso, solo hay una letra antes de una cantidad de uno o más dígitos. – zach

Respuesta

8

El stringr paquete a menudo tiene funciones convenientes para este tipo de cosas:

require(stringr) 
str_extract(c("A1","B2","C123"),"[[:upper:]]") 
#[1] "A" "B" "C" 
str_extract(c("A1","B2","C123"),"[[:digit:]]+") 
#[1] "1" "2" "123" 

Eso supone que cada elemento tiene exactamente una parte "letra", y una "serie" parte, ya str_extract es sólo tirando de la primera instancia de un partido.

+0

gracias. eso funciona genial – zach

13

Puede utilizar gsub para eliminar todos los no-dígitos, o todos los caracteres de dígitos de esta manera:

> x <- "A3" 
> gsub("[^[:digit:]]","",x) 
"3" 
> gsub("[:digit:]","",x) 
"A" 

Y entonces usted puede utilizar as.numeric convertir de cadena a número, si lo desea.

+0

gracias aaronjg. esto funciona muy bien también. – zach

+0

Puede agregar una solución para extraer letras (vea la respuesta de joran). De hecho, uno podría escribir una función para extraer letras y números y tener el trabajo 'apply' en la columna data.frame. :) –

+1

@aaronjg para obtener cartas necesitas un par adicional de [] – zach

3

Si, como sugiere su comentario sólo tiene una sola letra seguida de uno o más dígitos que podría hacer algo similar a esto:

x <- c("G10", "X1231", "y14522") 
# Just grab the first letter 
letter <- substring(x, 1, 1) 
letter 
# [1] "G" "X" "y" 
# Grab everything except the first character and convert to numeric 
number <- as.numeric(substring(x, 2, nchar(x))) 
number 
#[1] 10 1231 14522 
Cuestiones relacionadas