2015-09-27 58 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