2009-11-04 9 views
35

tengo el siguiente vector:Dividir un vector de cadena en R

tmp3 <- c("1500 2", "1500 1", "1510 2", "1510 1", "1520 2", "1520 1", "1530 2", 
"1530 1", "1540 2", "1540 1") 

me gustaría simplemente retener el segundo número en cada uno de los átomos de este vector, por lo que sería el siguiente:

c(2,1,2,1,2,1,2,1,2,1) 
+0

¿Se puede aceptar una respuesta para marcar la pregunta como resuelta? – MERose

Respuesta

31

Hay probablemente una mejor manera, pero aquí hay dos enfoques con strsplit():

as.numeric(data.frame(strsplit(tmp3, " "))[2,]) 
as.numeric(lapply(strsplit(tmp3," "), function(x) x[2])) 

El as.numer ic() puede no ser necesario si se puede usar caracteres ...

+0

Esta es una solución elegante. Justo lo que estaba buscando. ¡Gracias! – Zak

+0

Traté de usar su solución, pero en su lugar, utilizando la columna de un marco de datos y no funcionó de inmediato. Yo agregaría que para esos casos necesitas convertirlo en una lista. 'as.numeric (data.frame (strsplit (as.list (df $ columnx), "")) [2,]) ' – pedrosaurio

5
substr(x = tmp3, start = 6, stop = 6) 

Siempre y cuando sus cadenas son siempre la misma longitud, esto debe hacer el truco.

(Y, por supuesto, usted no tiene que especificar los nombres de los argumentos - substr(tmp3, 6, 6) funciona bien, también)

21

Se podría utilizar en read.tabletextConnection:

X <- read.table(textConnection(tmp3)) 

continuación

> str(X) 
'data.frame': 10 obs. of 2 variables: 
$ V1: int 1500 1500 1510 1510 1520 1520 1530 1530 1540 1540 
$ V2: int 2 1 2 1 2 1 2 1 2 1 

así que X$V2 es lo que necesita.

4

Esto debe hacerlo:

library(plyr) 
ldply(strsplit(tmp3, split = " "))[[2]] 

Si necesita un vector numérico, utilice

as.numeric(ldply(strsplit(tmp3, split = " "))[[2]]) 
9

Lo que creo que es la forma más elegante de hacer esto

>  res <- sapply(strsplit(tmp3, " "), "[[", 2) 

Si necesita que sea un número entero

>  storage.mode(res) <- "integer" 
+0

También,' res <- as.numeric (sapply (...)) 'funciona también; 'storage.mode' es un poco aterrador – user295691

-1

Una forma más fácil para dividir 1 en la columna 2 columnas a través de data.table

require(data.table) 
data_ex = data.table(a = paste(sample(1:3, size=10, replace=TRUE),"-separate", sep="")) 
data_ex[, number:= unlist(strsplit(x=a, split="-"))[[1]], by=a] 
data_ex[, word:= unlist(strsplit(x=a, split="-"))[[2]], by=a ] 
8

Depende un poco de qué tanto sus datos real coincida con el ejemplo de datos que has dado. Te está tratando de obtener todo tras el espacio, puede utilizar gsub:

gsub(".+\\s+", "", tmp3) 
[1] "2" "1" "2" "1" "2" "1" "2" "1" "2" "1" 

Si usted está tratando de aplicar una norma más complicado que "tomar todo después de que el espacio", se necesita un expresión regular más complicada.

+0

puede explicar esto ... – user3067923

+0

la función' gsub' es para reemplazar las coincidencias de expresiones regulares con otra cosa. En este caso, usamos la expresión regular '. + \\ s +' y reemplazamos cualquier coincidencia que encontremos con la cadena vacía '" "'. La expresión regular se traduce como "Coincidir con cualquier cosa al principio, pero tiene que terminar con un espacio" (el espacio de caracteres se escribe como '\\ s') –

1

Otra opción es scan(). Para obtener el segundo valor, podemos usar un subconjunto lógico.

scan(text = tmp3)[c(FALSE, TRUE)] 
# [1] 2 1 2 1 2 1 2 1 2 1 
Cuestiones relacionadas