2015-09-27 93 views
6

我都首先提到this question開頭刪除前導零,但答案並不在我的情況有所幫助。R:從字符串

我有一個列表,其中每個組件包含元素開始與數字,接着用文字(字符)。元素開頭的一些數字有一個或多個前導零。這裏是清單的一小部分:

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")) 

我想實現的是去除何時可仍然在0 Undefined開始有一個零前導零加上不啓動所有其他元素領先的零。也就是說,要獲得如下清單:

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")) 

我已經幾個小時沒有成功。我所能做的最好的是這樣的:

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

然而,它只是返回在那裏有前導零組件列表的元素,但不是沒有休息,也沒有0 Undefined

有人可以幫忙嗎?

回答

6

我們循環訪問listlapply(x, ..)),使用sub替換list元素中的前導零。我們匹配多個零的一個從後面用正則表達式正前瞻((?=[1-9]))指定數字1-9的字符串(^0+)的開頭,並與''更換。

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

或在評論@hwnd提到的,我們可以使用捕獲組即代替lookahead

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

使用或不使用匿名函數,我們可以指定patternreplacement參數的sub

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

它完美!非常感謝你! – panman

+2

您可以省略'perl = TRUE'參數,而不是真的需要。 'lapply(x,function(y)sub('^ 0 +([1-9])','\\ 1',y))' – hwnd

+1

@hwnd:謝謝! – panman