2012-04-25 14 views
8

¿Cómo puedo dividir eficientemente la siguiente cadena en la primera coma usando la base?Dividir en la primera coma en la cadena

x <- "I want to split here, though I don't want to split elsewhere, even here." 
strsplit(x, ???) 

deseado (con 2 cadenas):

[[1]] 
[1] "I want to split here" "though I don't want to split elsewhere, even here." 

Gracias de antemano.

EDITAR: No pensé en mencionar esto. Esto tiene que ser capaz de generalizar a una columna, vector de cadenas de este tipo, como en:

y <- c("Here's comma 1, and 2, see?", "Here's 2nd sting, like it, not a lot.") 

El resultado puede ser de dos columnas o un vector largo (que puedo tomar todos los demás elementos del) o una lista de picaduras con cada índice ([[n]]) con dos cadenas.

Disculpas por la falta de claridad.

+0

muy hacky, pero ¿qué pasa con algo como 'lista (la cabeza (y [[1]], 1), pasta (la cola (y [[1]], - 1), el colapso = "")) 'donde' y' es la salida de 'strsplit (x, ...)'? – Chase

+0

Chase Lo probé, pero parece que no funciona para un vector de cadenas similares.Edité mi publicación original para explicar mejor el problema. –

+0

el 'str_locate_all (string = y, ',')' encontrará todas las ubicaciones de índice de su patrón (coma en su caso) que luego se pueden aplicar para seleccionar fuera de vector o columna. – John

Respuesta

11

Esto es lo que probablemente haría. Puede parecer cursi, pero dado que sub() y strsplit() están vectorizados, también funcionará sin problemas cuando se le entreguen múltiples cadenas.

XX <- "SoMeThInGrIdIcUlOuS" 
strsplit(sub(",\\s*", XX, x), XX) 
# [[1]] 
# [1] "I want to split here"        
# [2] "though I don't want to split elsewhere, even here." 
+0

@ josh-obrien Cómo ampliaría ese código para recortar el espacio inicial en [2]. – John

+1

Lo envolveré con 'gsub ("^\\ s + | \\ s + $ "," ", MATERIA DE JOSH)' –

+0

Me gusta Josh. Funciona y es bastante simple y se mantiene en la base. gracias. +1 –

2

library(stringr)

str_sub(x,end = min(str_locate(string=x, ',')-1))

Esto hará que el primer bit que desea. Cambie start= y end= en str_sub para obtener lo que desee.

Tales como:

str_sub(x,start = min(str_locate(string=x, ',')+1))

y envolver en str_trim para deshacerse del espacio inicial:

str_trim(str_sub(x,start = min(str_locate(string=x, ',')+1)))

2

Esto funciona, pero me gusta de Josh Obrien mejor:

y <- strsplit(x, ",") 
sapply(y, function(x) data.frame(x= x[1], 
    z=paste(x[-1], collapse=",")), simplify=F)) 

Inspirado por la respuesta de persecución.

Un número de personas que no dio base de enfoques por lo que figura que me gustaría añadir la que yo suelo utilizar (aunque en este caso que necesitaba una respuesta de base):

y <- c("Here's comma 1, and 2, see?", "Here's 2nd sting, like it, not a lot.") 
library(reshape2) 
colsplit(y, ",", c("x","z")) 
+0

En su primera parte, no veo por qué usaría sapply sobre seq_along (y) en lugar de solo y. No parece que realmente necesite el índice explícitamente. También parece que estás eliminando todas las comas, aunque quisieras que se mantuvieran en las otras cadenas. – Dason

+0

@Dason Lo arreglé –

8

Desde el paquete stringr:

str_split_fixed(x, pattern = ', ', n = 2) 
#  [,1]     
# [1,] "I want to split here" 
#  [,2]             
# [1,] "though I don't want to split elsewhere, even here." 

(Eso es una matriz con una fila y dos columnas.)

3

Aquí es otra solución, con una expresión regular para capturar lo que es antes y después de la primera coma

x <- "I want to split here, though I don't want to split elsewhere, even here." 
library(stringr) 
str_match(x, "^(.*?),\\s*(.*)")[,-1] 
# [1] "I want to split here"        
# [2] "though I don't want to split elsewhere, even here." 
Cuestiones relacionadas