2012-05-24 17 views
37

Cho một chuỗi ký tựR strsplit với nhiều đối số chia tách không theo thứ tự?

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

Tôi muốn để có được

"abc" 
"def" 
"ghi" 

Tuy nhiên, sử dụng strsplit, người ta phải biết thứ tự của các giá trị tách trong chuỗi, như strsplit sử dụng giá trị đầu tiên cần làm sự phân chia đầu tiên, thứ hai để làm thứ hai ... và sau đó tái chế.

Nhưng điều này không:

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

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

Tôi đang tìm kiếm để phân chia các chuỗi bất cứ nơi nào tôi tìm thấy bất kỳ giá trị tách của tôi trong một bước duy nhất.

+0

Thực ra 'strsplit (test_1, c (" ",", "))' không hoạt động đối với tôi. Nó trả về: '" abc def "" ghi klm "' – betabandido

+0

Bạn nói đúng. Tôi đã gỡ bỏ nó. Tôi vẫn muốn thêm một ví dụ làm việc bằng cách sử dụng nhiều giá trị chia nhỏ nếu bạn có. –

Trả lời

45

Trên thực tế strsplit sử dụng mẫu grep cũng như:

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

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

Nếu không sử dụng cả hai \\,\\, (lưu ý thêm không gian mà SO không hiển thị), bạn đã có thể nhận một số nhân vật (0) giá trị. Có thể đã rõ ràng hơn nếu tôi đã viết:

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

@Fojtasek rất hợp: Sử dụng các lớp nhân vật thường đơn giản hoá công việc bởi vì nó tạo ra một logic ngầm OR:

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

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

làm thế nào về strsplit (test_2, "[,] +") – Fojtasek

+5

cũng 'strsplit (test_2," [[: punct:] [: space:]] + ")' cho yêu cầu cập nhật của OP. – jthetzel

5

Bạn có thể đi với strsplit(test_1, "\\W").

+0

Nó không hoạt động cho 'test2' – betabandido

+0

Bạn có thể đi với strsplit (test_1," \\ W + "). –

5

Trong trường hợp bạn không thích biểu thức thông thường, bạn có thể gọi strsplit() nhiều lần:

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" 

Cập nhật cho ví dụ thêm

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

Nhưng nếu bạn đang sử dụng thường xuyên biểu thức, bạn cũng có thể thực hiện theo cách tiếp cận của @ 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) 
Các vấn đề liên quan