2013-04-09 29 views
36

tôi có một danh sách ngày sinh nhật mà giống như thế này:Sử dụng gsub để trích xuất chuỗi ký tự trước khoảng trắng trong R

dob <- c("9/9/43 12:00 AM/PM", "9/17/88 12:00 AM/PM", "11/21/48 12:00 AM/PM") 

Tôi muốn chỉ cần lấy ngày lịch kể từ biến này (tức là thả tất cả mọi thứ sau lần xuất hiện đầu tiên của không gian trắng).

Dưới đây là những gì tôi đã cố gắng cho đến nay:

dob.abridged <- substring(dob,1,8) 
dob 
[1] "9/9/43 1" "9/17/88 " "11/21/48" 
dob.abridged <- gsub(" $","", dob.abridged, perl=T) 
> dob.abridged 
[1] "9/9/43 1" "9/17/88" "11/21/48" 

Vì vậy, mã của tôi làm việc cho những ngày lịch có độ dài 6 hoặc 7, nhưng không dài 8. Bất kỳ gợi ý về một regex hiệu quả hơn để sử dụng với gsub rằng có thể xử lý các ngày theo lịch có độ dài 6, 7 hoặc 8?

Cảm ơn bạn.

Trả lời

85

Không cần substring, chỉ cần sử dụng gsub:

gsub(" .*$", "", dob) 
# [1] "9/9/43" "9/17/88" "11/21/48" 

Một không gian (), sau đó bất kỳ ký tự (.) bất kỳ số lần (*) cho đến cuối chuỗi ($). Xem ?regex để tìm hiểu các biểu thức chính quy.

+2

Lời khuyên duy nhất tôi có thể chia sẻ ở đây là một 'phụ' là đủ vì chỉ có một vị trí kết thúc chuỗi. –

13

Tôi thường sử dụng strsplit cho các loại vấn đề này nhưng thích câu trả lời của Romain đơn giản như thế nào. Tôi nghĩ rằng nó sẽ là thú vị để so sánh giải pháp Romain để một câu trả lời strsplit:

Dưới đây là một giải pháp strsplit:

sapply(strsplit(dob, "\\s+"), "[", 1) 

Sử dụng gói microbenchmark và dob <- rep(dob, 1000) với dữ liệu gốc:

Unit: milliseconds 
            expr  min  lq median 
        gsub(" .*$", "", dob) 4.228843 4.247969 4.258232 
sapply(strsplit(dob, "\\\\s+"), "[", 1) 14.438241 14.558832 14.634638 
     uq  max neval 
    4.268029 5.081608 1000 
14.756628 53.344984 1000 

Các người chiến thắng rõ ràng trên một máy Win 7 là gsub regex từ Romain. Cảm ơn câu trả lời và giải thích Romain.

1

Thư viện stringr chứa chức năng phù hợp với vấn đề này.

library(stringr) 
word(dob,1) 
# [1] "9/9/43" "9/17/88" "11/21/48" 
Các vấn đề liên quan