2015-09-27 13 views
6

Ich habe zuerst auf this question verwiesen, aber die Antworten haben in meinem Fall nicht geholfen.R: Entfernen führende Nullen vom Anfang einer Zeichenfolge

Ich habe eine Liste, in der jede Komponente Elemente beginnend mit Zahlen gefolgt von Wörtern (Zeichen) enthält. Einige der Zahlen am Anfang der Elemente haben eine oder mehrere führende Nullen. Hier ist kleiner Teil der Liste:

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

Was ich erreichen will ist es, die führenden Nullen zu entfernen, wo sie verfügbar sind, und haben immer noch die einzige Null am Anfang 0 Undefined sowie alle anderen Elemente, die nicht fangen mit führende Nullen. Das heißt, die folgende Liste zu haben:

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

Ich bin seit Stunden ohne Erfolg gegangen. Das Beste, was ich tun könnte, ist dies:

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

Aber es gibt nur diese Elemente in der Liste Komponenten, bei denen es Nullen wurden führende, nicht aber der Rest ohne und auch ohne 0 Undefined.

Kann jemand helfen?

Antwort

6

Wir durchlaufen die list (lapply(x, ..)), verwenden Sie sub, um die führenden Nullen in den list Elementen zu ersetzen. Wir passen auf eine von mehreren Nullen vom Anfang der Zeichenfolge (^0+), gefolgt von Zahlen 1-9, die durch den positiven Regex-Lookahead ((?=[1-9])) angegeben werden, und ersetzen sie durch ''.

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

Oder wie @hwnd in den Kommentaren erwähnt, können wir Capture-Gruppe das heißt statt lookahead verwenden.

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

oder ohne die anonyme Funktion zu verwenden, können wir die pattern und replacement Argumente von sub

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

Es funktioniert perfekt angeben! Vielen Dank! – panman

+2

Sie können den Parameter 'perl = TRUE' weglassen, der nicht wirklich benötigt wird. 'lapply (x, Funktion (y) sub ('^ 0 + ([1-9])', '\\ 1', y))' – hwnd

+1

@hwnd: Danke! – panman

Verwandte Themen