2012-05-24 14 views
37

Biorąc pod uwagę ciąg znakówR strsplit z wieloma nieuporządkowanymi argumentami podziału?

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

pragnę uzyskać

"abc" 
"def" 
"ghi" 

Jednak użycie strsplit, trzeba znać kolejność wartości rozbitego w łańcuchu, jak strsplit wykorzystuje pierwszą wartość zrobić pierwszy podział, drugi drugi ... a następnie przetwarza.

Ale tego nie robi:

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

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

szukam podzielić ciąg gdzie mogę znaleźć żadnego z moich wartości rozbitego w jednym kroku.

+0

W rzeczywistości 'strsplit (test_1, c (" ",", "))' nie działa dla mnie. Zwraca: '' abc def "" ghi klm "' – betabandido

+0

Masz rację. Usunąłem to. Nadal chcę dodać działający przykład przy użyciu wielu wartości podziału, jeśli taki posiadasz. –

Odpowiedz

45

Właściwie strsplit wykorzystuje wzorce grep także:

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

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

Bez użycia zarówno \\, i \\, (uwaga dodatkową przestrzeń, że SO nie pokazuje) byś zdobyć kilka znaków (0) wartości. Mogło być jaśniejsze gdybym napisał:

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

@Fojtasek jest więc rację: Używanie klas znakowych często upraszcza zadanie, ponieważ tworzy niejawny logiczną OR:

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

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

jak o strsplit (test_2, "[,] +") – Fojtasek

+5

również 'strsplit (test_2, [[: punct:] [: spacja:]] +") 'dla zaktualizowanego żądania OP. – jthetzel

5

Można iść z strsplit(test_1, "\\W").

+0

To nie działa dla 'test2' – betabandido

+0

Możesz pójść ze strsplit (test_1," \\ W + "). –

5

W przypadku, gdy nie podoba wyrażeń regularnych, możesz zadzwonić strsplit() wielokrotnie:

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" 

Updated dla dodanego przykład

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

Ale jeśli masz zamiar używać regularny wyrażenia, możesz równie dobrze stosować metodę @ 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) 
Powiązane problemy