2012-10-04 10 views
10

Imaginemos que tiene una cadena:Extracto de todos los números de una sola cadena en I

strLine <- "The transactions (on your account) were as follows: 0 3,000 (500) 0 2.25 (1,200)" 

¿Hay una función que elimina los números en una matriz/vector que produce la siguiente solución requerida:

result <- c(0, 3000, -500, 0, 2.25, -1200)? 

es decir

result[3] = -500 

Aviso, los números se presentan en forma de contabilidad números tan negativos appe ar entre(). Además, puede suponer que solo aparecen los números a la derecha de la primera aparición de un número. No soy tan bueno con la expresión regular, así que agradecería que me ayudaras si fuera necesario. Además, no quiero suponer que la cadena sea siempre la misma, así que estoy tratando de eliminar todas las palabras (y cualquier carácter especial) antes de la ubicación del primer número.

Respuesta

24
library(stringr) 
x <- str_extract_all(strLine,"\\(?[0-9,.]+\\)?")[[1]] 
> x 
[1] "0"  "3,000" "(500)" "0"  "2.25" "(1,200)" 

Cambiar los parens a los negativos:

x <- gsub("\\((.+)\\)","-\\1",x) 
x 
[1] "0"  "3,000" "-500" "0"  "2.25" "-1,200" 

Y luego as.numeric() o taRifx::destring para terminar (la next version de destring apoyará negativos de forma predeterminada para la opción keep no será necesario):

library(taRifx) 
destring(x, keep="0-9.-") 
[1] 0 3000 -500 0 2.25 -1200 

OR:

as.numeric(gsub(",","",x)) 
[1]  0 3000 -500  0  2.25 -1200 
+0

Oye, te falta un punto en tu primera expresión regular. El resultado debería tener 2.25, no 2 y 25. –

+0

@mplourde ¡Vaya! Gracias por señalar eso. –

+0

Esto da miedo. Tu expresión regular funciona como yo quería. Intenté como, 5 regex y ninguno trae los valores independientes del signo decimal (.,,), Tu do. ¡Gracias! –

17

Aquí es la forma de base R, en aras de la exhaustividad ...

x <- unlist(regmatches(strLine, gregexpr('\\(?[0-9,.]+', strLine))) 
x <- as.numeric(gsub('\\(', '-', gsub(',', '', x))) 
[1]  0.00 3000.00 -500.00  0.00  2.25 -1200.00 
+0

Gracias. Ambas respuestas son concisas y lo que estaba buscando. – Bertie

+0

Elimina el punto y la segunda coma de la primera línea si sabes que todos los números son> 0, por ejemplo, cuando los nombres de las columnas están numerados como en: 'col.1 col.2 col.3'. –

+0

que pasa si me gustaría tenerlo de otra forma. Tengo un marco de datos con valores negativos, quiero reemplazarlos por(). por favor ayuda –

0

Lo que para mí funcionó a la perfección cuando se trabaja en cadenas individuales en un data frame (Una cadena por fila en la misma columna) fue el siguientes:

library(taRifx) 
DataFrame$Numbers<-as.character(destring(DataFrame$Strings, keep="0-9.-")) 

los resultados están en una nueva columna de la misma data frame.

Cuestiones relacionadas