Для заголовка я ищу способ удалить начальный ноль с обеих сторон дефиса.
codes <- c("0002-01014", "0020-0014","00014-00010")
want <- c("2-1014","20-14","14-10")
Я предполагаю, что можно разделить числа на два, удалить ведущий ноль, а затем вставить вместе, но мне было интересно, есть ли более усовершенствованный метод, использующий один шаг из str_extract()
, str_replace()
и подобных.
Редактировать:
Я сейчас использую
str_split("0002-01010","-",simplify=T) %>%
str_replace("^0+(?!$)", "") %>%
str_c(collapse="-")
И было любопытно, есть ли альтернативный метод, который может быть реализован в одной строке.
2 ответа
Ты можешь использовать
codes <- c("0002-01014", "0020-0014","00014-00010", "00000-122345")
gsub("\\b0+\\B", "", codes, perl=TRUE)
# => [1] "2-1014" "20-14" "14-10" "0-122345"
См. демонстрацию R и демонстрация регулярного выражения.
\b
соответствует позиции между началом строки или символом, не являющимся словом, и символом слова, здесь, в начале строки или между -
и следующей цифрой. 0+
соответствует одному или нескольким нулям, насколько это возможно. \B
следит за тем, чтобы совпадение прекращалось перед цифрой, поэтому, если в номере только нули, последний остается неизменным.
Вы также можете сопоставить и удалить нули в начале или после тире, но не в конце или перед тире:
codes <- c("0002-01014", "0020-0014","00014-00010", "00000-000330")
gsub("(^|-)0+(?!-|$)", "\\1", codes, perl=TRUE)
См R доказательство. См. доказательство регулярного выражения.
Объяснение выражения
--------------------------------------------------------------------------------
( group and capture to \1:
--------------------------------------------------------------------------------
^ the beginning of the string
--------------------------------------------------------------------------------
| OR
--------------------------------------------------------------------------------
- '-'
--------------------------------------------------------------------------------
) end of \1
--------------------------------------------------------------------------------
0+ '0' (1 or more times (matching the most
amount possible))
--------------------------------------------------------------------------------
(?! look ahead to see if there is not:
--------------------------------------------------------------------------------
- '-'
--------------------------------------------------------------------------------
| OR
--------------------------------------------------------------------------------
$ before an optional \n, and the end of
the string
--------------------------------------------------------------------------------
) end of look-ahead
Похожие вопросы
Новые вопросы
r
R - это бесплатный язык программирования с открытым исходным кодом и программная среда для статистических вычислений, биоинформатики, визуализации и общих вычислений. Пожалуйста, предоставьте минимальные и воспроизводимые примеры вместе с желаемым результатом. Используйте dput () для данных и укажите все небазовые пакеты с вызовами library (). Не вставляйте изображения для данных или кода, вместо этого используйте блоки кода с отступом. По вопросам, связанным со статистикой, используйте https://stats.stackexchange.com.