2012-11-29 30 views
8

Tôi đã cố gắng chia chuỗi không gian phân cách bằng dấu ngoặc kép trong R trong một thời gian nhưng không thành công. Một ví dụ về một chuỗi như sau:Tách chuỗi theo khoảng trắng trừ khi được chứa trong dấu ngoặc đơn

mưa tuyết rơi "lưu trữ Kênh" "lạch lưu trữ"

Điều quan trọng đối với chúng tôi là bởi vì đây là những tiêu đề cột phải phù hợp với dữ liệu tiếp theo. Có ý kiến ​​cho khác trên trang web này như thế nào để đi về điều này nhưng họ dường như không làm việc với R. Một ví dụ:

Regex for splitting a string using space when not surrounded by single or double quotes

Dưới đây là một số mã tôi đã cố gắng:

str <- 'rainfall snowfall "Channel storage" "Rivulet storage"' 
regex <- "[^\\s\"']+|\"([^\"]*)\"" 
split <- strsplit(str, regex, perl=T) 

những gì tôi muốn là

[1] "rainfall" "snowfall" "Channel storage" "Rivulet storage" 

nhưng những gì tôi nhận được là:

[1] "" " " " " " " 

Vectơ có độ dài phù hợp (điều này đáng khích lệ) nhưng tất nhiên các chuỗi trống hoặc chứa một khoảng trắng. Bất kỳ đề xuất?

Cảm ơn trước!

Trả lời

15

scan sẽ làm việc này cho bạn

scan(text=str, what='character', quiet=TRUE) 
[1] "rainfall"  "snowfall"  "Channel storage" "Rivulet storage" 
+0

Cảm ơn mplourde. Đó chính xác là những gì tôi cần. – downtowater

5

Như mplourde nói, sử dụng scan. đó là giải pháp sạch nhất (trừ khi bạn muốn giữ \", tức là ...)

Nếu bạn muốn sử dụng regexes để thực hiện việc này (hoặc điều gì đó không được giải quyết dễ dàng bởi scan), bạn vẫn đang xem nó sai đường. Regex của bạn trả về những gì bạn muốn, vì vậy nếu bạn sử dụng nó trong strsplit, nó sẽ cắt bỏ mọi thứ bạn muốn giữ lại.

Trong các trường hợp này, bạn nên xem hàm gregexp, trả về vị trí bắt đầu của các kết quả phù hợp và thêm độ dài của đối sánh làm thuộc tính. Kết quả của việc này có thể được truyền cho hàm regmatches(), như thế này:

str <- 'rainfall snowfall "Channel storage" "Rivulet storage"' 
regex <- "[^\\s\"]+|\"([^\"]+)\"" 

regmatches(str,gregexpr(regex,str,perl=TRUE)) 

Nhưng nếu bạn chỉ cần vector nhân vật như các giải pháp của lợi nhuận mplourde, hãy cho điều đó. Và nhiều khả năng đó là những gì bạn đang theo đuổi.

+3

Bạn có thể sử dụng 'regmatches' thay vì' mapply': 'regmatches (str, gregexpr (regex, str, perl = TRUE)) [[1]]' –

+0

Không thể tìm thấy nó, thx cho con trỏ. chỉnh sửa phù hợp –

+0

nhờ Joris (và mplourde) - bạn nói đúng, quét là những gì tôi cần, nhưng rất hữu ích cho tôi để xem cách áp dụng các hàm regmatch() trong ngữ cảnh này – downtowater

1

Bạn có thể sử dụng strapply từ gói gsubfn. Trong strapply bạn có thể xác định chuỗi phù hợp hơn là tách chuỗi.

str <- "rainfall snowfall 'Channel storage' 'Rivulet storage'" 
strapply(str,"\\w+|'\\w+ \\w+'",c)[[1]] 

[1] "rainfall"   "snowfall"   "'Channel storage'" "'Rivulet storage'" 
Các vấn đề liên quan