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

Прокрутите list (lapply(x, ..)), используйте sub, чтобы заменить ведущие нули в элементах list. Мы сопоставляем один из ноль от начала строки (^0+), за которым следуют номера 1-9, заданные положительным регулярным выражением ((?=[1-9])) и заменяем его ''.

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

Или, как @hwnd упоминалось в комментариях, мы можем использовать захват группы т.е. вместо lookahead.

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

Или без использования анонимной функции, мы можем указать pattern и replacement аргументы 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

Смежные вопросы