2015-09-27 14 views
6

Ho fatto riferimento per la prima volta a this question, ma le risposte non sono state d'aiuto nel mio caso.R: Rimuovere gli zeri iniziali dall'inizio di una stringa di caratteri

Ho una lista in cui ogni componente contiene elementi che iniziano con numeri, seguiti da parole (caratteri). Alcuni numeri all'inizio degli elementi hanno uno o più zeri iniziali. Ecco piccola parte della lista:

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

Quello che voglio raggiungere è quello di rimuovere gli zeri iniziali dove sono disponibili e hanno ancora il singolo zero all'inizio di 0 Undefined più di tutti gli altri elementi che non iniziano con zeri principali. Cioè, per avere la lista come segue:

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

mi sono state andando per ore ora senza successo. Il meglio che ho potuto fare è questo:

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

Tuttavia, restituisce solo quegli elementi nei componenti della lista in cui c'erano zeri iniziali, ma non il resto, senza e anche senza 0 Undefined.

Qualcuno può aiutare?

risposta

6

Attraverso il list (lapply(x, ..)), utilizzare sub per sostituire gli zeri iniziali negli elementi list. Corrispondiamo a uno o più zero dall'inizio della stringa (^0+) seguito dai numeri 1-9 specificati dall'espressione regolare dell'espressione regolare ((?=[1-9])) e sostituita con ''.

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

O come @hwnd accennato nei commenti, possiamo usare gruppo cattura vale a dire, invece di lookahead.

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

O senza utilizzare la funzione anonima, possiamo specificare i pattern e replacement argomenti di sub

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

funziona perfettamente! Grazie mille! – panman

+2

È possibile omettere il parametro 'perl = TRUE', non realmente necessario. 'lapply (x, function (y) sub ('^ 0 + ([1-9])', '\\ 1', y))' – hwnd

+1

@hwnd: Grazie! – panman