2015-09-27 17 views
6

Trước tiên tôi đã gọi đến số this question, nhưng câu trả lời không giúp ích gì trong trường hợp của tôi.R: Xóa các số 0 đứng đầu từ đầu chuỗi ký tự

Tôi có một danh sách trong đó mỗi thành phần chứa các phần tử bắt đầu bằng số, theo sau với các từ (ký tự). Một số số ở đầu các phần tử có một hoặc nhiều số 0 đầu. Dưới đây là một phần nhỏ của danh sách:

x <- list(el1 = c("0010 First", 
        "0200 Second", 
        "0300 Third", 
        "4000 Fourth", 
        "0 Undefined", 
        "60838 Random", 
        "903200 Haphazard"), 
      el2 = c("0100 Hundredth", 
        "0200 Two hundredth", 
        "0300 Three hundredth", 
        "0040 Fortieth", 
        "0 Undefined", 
        "949848 Random", 
        "202626 Haphazard"), 
      el3 = c("0010 First", 
        "0200 Second", 
        "0300 Third", 
        "0100 Hundredth", 
        "0200 Two hundredth", 
        "0300 Three hundredth", 
        "0 Undefined", 
        "60838 Random", 
        "20200 Haphazard")) 

Những gì tôi muốn đạt được là để loại bỏ các số không hàng đầu mà họ đang có sẵn và vẫn có đơn zero vào đầu 0 Undefined cộng với tất cả các yếu tố khác mà không bắt đầu với hàng đầu zeroes. Tức là, để có danh sách như sau:

x <- list(el1 = c("10 First", 
        "200 Second", 
        "300 Third", 
        "4000 Fourth", 
        "0 Undefined", 
        "60838 Random", 
        "903200 Haphazard"), 
      el2 = c("100 Hundredth", 
        "200 Two hundredth", 
        "300 Three hundredth", 
        "40 Fortieth", 
        "0 Undefined", 
        "949848 Random", 
        "202626 Haphazard"), 
      el3 = c("10 First", 
        "200 Second", 
        "300 Third", 
        "100 Hundredth", 
        "200 Two hundredth", 
        "300 Three hundredth", 
        "0 Undefined", 
        "60838 Random", 
        "20200 Haphazard")) 

Tôi đã đi hàng giờ rồi mà không thành công. Điều tốt nhất tôi có thể làm là thế này:

lapply(x, function(i) { 
    ifelse(grep(pattern = "^0+[1-9]", x = i), 
     gsub(pattern = "^0+", replacement = "", x = i), i) 
}) 

Tuy nhiên, nó chỉ trả về những yếu tố trong các thành phần danh sách, nơi có được hàng đầu zero, nhưng không phải là phần còn lại mà không cần và cũng không 0 Undefined.

Ai đó có thể trợ giúp?

Trả lời

6

Chúng tôi lặp qua các list (lapply(x, ..)), sử dụng sub để thay thế các số 0 đứng đầu trong các phần tử list. Chúng tôi kết hợp một trong số không nhiều hơn từ đầu chuỗi (^0+) theo sau là số 1-9 được chỉ định bởi dấu kiểm tra ngược tích cực ((?=[1-9])) và thay thế bằng ''.

lapply(x, function(y) sub('^0+(?=[1-9])', '', y, perl=TRUE)) 

Hoặc như @hwnd đề cập trong các ý kiến, chúng ta có thể sử dụng nhóm chụp ví dụ: thay vì lookahead.

lapply(x, function(y) sub('^0+([1-9])', '\\1', y)) 

Hoặc mà không sử dụng chức năng ẩn danh, chúng ta có thể xác định patternreplacement lập luận của sub

lapply(x, sub, pattern='^0+([1-9])', replacement='\\1') 
+1

Nó hoạt động một cách hoàn hảo! Cảm ơn nhiều! – panman

+2

Bạn có thể bỏ qua tham số 'perl = TRUE', không thực sự cần thiết. 'lapply (x, hàm (y) sub ('^ 0 + ([1-9])', '\\ 1', y))' – hwnd

+1

@hwnd: Cảm ơn bạn! – panman

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