2012-05-24 12 views
37

dado una cadena de caracteresR strsplit con múltiples argumentos divididos desordenados?

test_1<-"abc def,ghi klm" 
test_2<-"abc, def ghi klm" 

deseo de obtener

"abc" 
"def" 
"ghi" 

Sin embargo, el uso de strsplit, se debe conocer el orden de los valores de división de la cadena, como strsplit utiliza el primer valor de hacer la primera división, la segunda para hacer la segunda ... y luego recicla.

Pero esto no es así:

strsplit(test_1, c(",", " ")) 
strsplit(test_2, c(" ", ",")) 

strsplit(test_2, split=c("[:punct:]","[:space:]"))[[1]] 

Busco a dividir la cadena dondequiera que la encuentre cualquiera de mis valores de división en un solo paso.

+0

En realidad 'strsplit (test_1, c (" ",", "))' no funciona para mí. Devuelve: '" abc def "" ghi klm "' – betabandido

+0

Tienes razón. Lo quité. Todavía quiero agregar un ejemplo de trabajo usando múltiples valores divididos si tiene uno. –

Respuesta

45

En realidad strsplit utiliza patrones grep así:

> strsplit(test_1, "\\, |\\,| ") 
[[1]] 
[1] "abc" "def" "ghi" "klm" 

> strsplit(test_2, "\\, |\\,| ") 
[[1]] 
[1] "abc" "def" "ghi" "klm" 

Sin utilizar tanto \\, y \\, (nota superficie más grande que lo que no muestran) que habría conseguido algunos caracteres (0) valores. Podría haber sido más claro si había escrito:

> strsplit(test_2, "\\,\\s|\\,|\\s") 
[[1]] 
[1] "abc" "def" "ghi" "klm" 

@Fojtasek es tan a la derecha: El uso de clases de personajes a menudo simplifica la tarea, ya que crea una lógica OR implícito:

> strsplit(test_2, "[, ]+") 
[[1]] 
[1] "abc" "def" "ghi" "klm" 

> strsplit(test_1, "[, ]+") 
[[1]] 
[1] "abc" "def" "ghi" "klm" 
+4

¿qué tal strsplit (test_2, "[,] +") – Fojtasek

+5

también 'strsplit (test_2," [[: punct:] [: space:]] + ")' para la solicitud actualizada de OP. – jthetzel

5

Usted podría ir con strsplit(test_1, "\\W").

+0

No funciona para 'test2' – betabandido

+0

Puedes ir con strsplit (test_1," \\ W + "). –

5

En caso de que no le gusta expresiones regulares, puede llamar varias veces strsplit():

strsplits <- function(x, splits, ...) 
{ 
    for (split in splits) 
    { 
     x <- unlist(strsplit(x, split, ...)) 
    } 
    return(x[!x == ""]) # Remove empty values 
} 

strsplits(test_1, c(" ", ",")) 
# "abc" "def" "ghi" "klm" 
strsplits(test_2, c(" ", ",")) 
# "abc" "def" "ghi" "klm" 

Actualizado para el ejemplo añadido

strsplits(test_1, c("[[:punct:]]","[[:space:]]")) 
# "abc" "def" "ghi" "klm" 
strsplits(test_2, c("[[:punct:]]","[[:space:]]")) 
# "abc" "def" "ghi" "klm" 

Pero si se va a utilizar regularmente expresiones, también podría ir con el enfoque de @ DWin:

strsplit(test_1, "[[:punct:][:space:]]+")[[1]] 
# "abc" "def" "ghi" "klm" 
strsplit(test_2, "[[:punct:][:space:]]+")[[1]] 
# "abc" "def" "ghi" "klm" 
0
test_1<-"abc def,ghi klm" 
test_2<-"abc, def ghi klm" 
key_words <- c("abc","def","ghi") 
matches <- str_c(key_words, collapse ="|") 
str_extract_all(test_1, matches) 
str_extract_all(test_2, matches)