У меня есть набор данных, который выглядит примерно так:
anim <- c(25499,25500,25501,25502,25503,25504)
sex <- c(1,2,2,1,2,1)
wt <- c(0.8,1.2,1.0,2.0,1.8,1.4)
data <- data.frame(anim,sex,wt)
data
anim sex wt anim2
1 25499 1 0.8 2
2 25500 2 1.2 2
3 25501 2 1.0 2
4 25502 1 2.0 2
5 25503 2 1.8 2
6 25504 1 1.4 2
Я хотел бы добавить ноль перед каждым идентификатором животного:
data
anim sex wt anim2
1 025499 1 0.8 2
2 025500 2 1.2 2
3 025501 2 1.0 2
4 025502 1 2.0 2
5 025503 2 1.8 2
6 025504 1 1.4 2
И ради интереса, что если мне нужно добавить два или три нуля перед идентификаторами животных?
data$anim = paste(rep(0, n), data$anim, sep = "")
Ответы:
Краткая версия: используйте
formatC
илиsprintf
.Более длинная версия:
Для форматирования чисел доступно несколько функций, включая добавление начальных нулей. Какой из них лучше, зависит от того, какое форматирование вы хотите сделать.
Пример из вопроса довольно прост, так как все значения имеют одинаковое количество цифр для начала, поэтому давайте попробуем более сложный пример создания степеней шириной 10 и 8.
paste
(и его вариантpaste0
) часто являются первыми функциями обработки строк, с которыми вы сталкиваетесь. Они на самом деле не предназначены для манипулирования числами, но они могут быть использованы для этого. В простом случае, когда нам всегда нужно добавлять один ноль,paste0
это лучшее решение.Для случая, когда в числах есть переменное число цифр, вы должны вручную вычислить, сколько нулей нужно добавить, что достаточно ужасно, что вы должны делать это только из болезненного любопытства.
str_pad
изstringr
работ аналогичноpaste
, делая более явным, что вы хотите дополнить вещи.Опять же, он на самом деле не предназначен для использования с числами, поэтому в более сложном случае нужно немного подумать. Мы должны просто сказать «pad with zeroes to width 8», но посмотрим на этот вывод:
Вы должны установить научный штрафной вариант , так что номера всегда отформатированы с использованием фиксированного обозначения (а не научная нотации).
stri_pad
вstringi
работах так же, какstr_pad
изstringr
.formatC
представляет собой интерфейс для функции Cprintf
. Для его использования требуется знание тайны этой базовой функции (см. Ссылку). В этом случае, важные моменты являютсяwidth
аргументом,format
будучи"d"
на «целое», и"0"
flag
для Предварения нулей.Это мое любимое решение, поскольку с изменением ширины легко повременить, а функция достаточно мощная для внесения других изменений форматирования.
sprintf
интерфейс с одноименной функцией C; вроде быformatC
но с другим синтаксисом.Основное преимущество
sprintf
заключается в том, что вы можете вставлять отформатированные числа в более длинные биты текста.Смотрите также товарный ответ .
Для полноты картины стоит упомянуть другие функции форматирования, которые иногда полезны, но не имеют метода добавления нулей.
format
, универсальная функция для форматирования любого типа объекта, с методом для чисел. Это работает немного похожеformatC
, но с еще одним интерфейсом.prettyNum
еще одна функция форматирования, в основном для создания ручных меток оси. Это работает особенно хорошо для широкого диапазона чисел.scales
Пакет имеет несколько функций , такие какpercent
,date_format
иdollar
для специалистов типов форматов.источник
flag = "0"
.?sprintf
странице справки описывает это. «mn: два числа, разделенные точкой, обозначающие ширину поля (m) и точность (n)».Для общего решения, которое работает независимо от количества цифр
data$anim
, используйтеsprintf
функцию. Это работает так:В вашем случае вы, вероятно, хотите:
data$anim <- sprintf("%06d", data$anim)
источник
sprintf
преобразует число в строку (символ).Расширение на отклик @ goodside:
В некоторых случаях вы можете дополнить строку нулями (например, коды fips или другие числовые факторы). В OSX / Linux:
Но поскольку
sprintf()
вызывает команду C операционной системыsprintf()
, обсуждаемую здесь , в Windows 7 вы получаете другой результат:Итак, на компьютерах с Windows обходной путь:
источник
str_pad
теперь мой путь.str_pad
изstringr
пакета есть альтернатива.источник
str_pad
как это может привести к неожиданным результатам.i.num = 600000
;str_pad(i.num, width = 7, pad = "0")
даст вам «006e + 05», а не «0600000»Вот обобщаемая базовая функция R:
Мне нравится,
sprintf
но это идет с оговорками, такими как:источник
Вот еще одна альтернатива для добавления ведущих к нулям в строки, такие как CUSIP, которые иногда могут выглядеть как числа и которые многие приложения, такие как Excel, будут повреждать и удалять ведущие 0 или конвертировать их в научную нотацию.
Когда я попробовал ответ, предоставленный @metasequoia, у возвращаемого вектора были начальные пробелы, а не
0
s. Это была та же проблема, о которой упоминал @ user1816679 - и удаление кавычек вокруг0
или изменение с%d
на также%s
ничего не изменило . К вашему сведению, я использую RStudio Server, работающий на сервере Ubuntu. Это небольшое двухшаговое решение сработало для меня:gsub(pattern = " ", replacement = "0", x = sprintf(fmt = "%09s", ids[,CUSIP]))
с помощью
%>%
функции pipe изmagrittr
пакета это может выглядеть так:sprintf(fmt = "%09s", ids[,CUSIP]) %>% gsub(pattern = " ", replacement = "0", x = .)
Я бы предпочел однофункциональное решение, но оно работает.
источник
источник
Для других обстоятельств, в которых вы хотите, чтобы числовая строка была последовательной, я сделал функцию.
Кто-то может найти это полезным:
Извините за форматирование.
источник