2014-05-08 15 views
8

Tôi có một vector nhân vật d với ký tự chữ vàLoại bỏ số không ở đầu ký tự chữ và R

d <- c("template", "separate 00340", "00045", "890 098", "3405 garage", "matter00908") 

d 
[1] "template" "separate 00340" "00045"   "890 098"   "3405 garage"  "matter00908" 

Làm thế nào tôi có thể loại bỏ các số không ở đầu tất cả các số trong R? as.numeric sẽ xóa tất cả các số 0 đứng đầu chỉ trong các vectơ số hoặc số nguyên. Tôi đã thử gsub với regex nhưng không thể nhận được kết quả mong muốn.

Sản lượng dự kiến ​​như sau

out <- c("12309 template", "seperate 340", "45", "890 98", "3405 garage", "matter908") 
out 
[1] "12309 template" "seperate 340" "45"    "890 98"   "3405 garage" "matter908" 

Trả lời

13

Bạn có thể sử dụng một lookbehind tiêu cực để loại bỏ 0, trừ khi trước bởi một chữ số:

> d <- c("100001", "template", "separate 00340", "00045", "890 098", "3405 garage", "matter00908") 
> gsub("(?<![0-9])0+", "", d, perl = TRUE) 
[1] "100001"   "12309 template" "separate 340" "45"    
[5] "890 98"   "3405 garage" "matter908"  

Một cách khác để sử dụng regex:

> gsub("(^|[^0-9])0+", "\\1", d, perl = TRUE) 
[1] "100001"   "12309 template" "separate 340" "45"    
[5] "890 98"   "3405 garage" "matter908"  
> 
+0

Điều này cũng loại bỏ nhiều số 0 trong chuỗi số ví dụ. 100001 đến 101. – Crops

+1

@Crops Phải được khắc phục ngay bây giờ. – devnull

7

Đây là giải pháp sử dụng stri_replace_all_regex từ gói stringi:

d <- c("template", "separate 00340", "00045", 
     "890 098", "3405 garage", "matter00908") 
library("stringi") 
stri_replace_all_regex(d, "\\b0*(\\d+)\\b", "$1") 
## [1] "12309 template" "separate 340" "45"    "890 98" 
## [5] "3405 garage" "matter00908" 

Giải thích: Chúng tôi đang phù hợp với tất cả các trình tự của các chữ số trong phạm vi ranh giới từ (\b). Các số không được khớp được tham lam (0+). Các chữ số còn lại (\d biểu thị bất kỳ chữ số nào, \d+ biểu thị chuỗi không trống của chúng) được chụp trong một nhóm ((...)). Sau đó, chúng tôi thay thế tất cả các trận đấu như vậy chỉ bằng những nội dung được nhóm.

Nếu bạn cũng muốn muốn loại bỏ 0s trong vòng từ (như trong ví dụ của bạn), chỉ cần bỏ qua \b và gọi:

stri_replace_all_regex(d, "0*(\\d+)", "$1") 
## [1] "12309 template" "separate 340" "45"    "890 98" 
## [5] "3405 garage" "matter908" 
+0

gì về '\\ d +'? –

+1

được chỉnh sửa: * '\ d' biểu thị bất kỳ chữ số nào,' \ d + 'biểu thị chuỗi không trống của chúng * – gagolews

Các vấn đề liên quan