R strsplit avec plusieurs arguments séparés non ordonnés?

Étant donné une chaîne de caractères

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

Je souhaite obtenir

 "abc" "def" "ghi" 

Cependant, en utilisant strsplit, il faut connaître l’ordre des valeurs de fractionnement dans la chaîne, car strsplit utilise la première valeur pour effectuer le premier fractionnement, la seconde pour faire la seconde … et ensuite recycle.

Mais cela ne fait pas:

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

Je cherche à diviser la chaîne chaque fois que je trouve une de mes valeurs de division en une seule étape.

En fait, strsplit utilise également des patterns grep:

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

Sans les deux, \\, et \\, (notez l’espace supplémentaire que SO ne montre pas), vous auriez obtenu des valeurs de caractères (0). J’aurais pu être plus clair si j’avais écrit:

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

@Fojtasek a raison: l’utilisation de classes de caractères simplifie souvent la tâche car elle crée un OU logique implicite:

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

Vous pouvez aller avec strsplit(test_1, "\\W") .

Si vous n’aimez pas les expressions régulières, vous pouvez appeler strsplit() plusieurs fois:

 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" 

Mis à jour pour l'exemple ajouté

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

Mais si vous utilisez des expressions régulières, vous pourriez aussi bien utiliser l'approche de @DWin:

 strsplit(test_1, "[[:punct:][:space:]]+")[[1]] # "abc" "def" "ghi" "klm" strsplit(test_2, "[[:punct:][:space:]]+")[[1]] # "abc" "def" "ghi" "klm" 
  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)