Как добавить & ldquo; 0 & rdquo; на месяц число в lubridate в r [дубликат]

Попробуйте это с примером

<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1  /jquery.min.js"></script>
<form id="myForm">
<input type="radio" name="radio" value="first"/> 1 <br/>
<input type="radio" name="radio" value="second"/> 2 <br/>
</form>



<script>
$(document).ready(function () {
    $('#myForm').on('click', function () {
        var value = $("[name=radio]:checked").val();

        alert(value);
    })
});
</script>
255
задан Peter Mortensen 24 May 2016 в 13:29
поделиться

7 ответов

Короткий вариант: используйте formatC или sprintf .


Более длинная версия:

Существует несколько функций для форматирования чисел, включая добавление ведущих нулей. Какой из них лучше всего зависит от того, какое другое форматирование вы хотите сделать.

Пример из вопроса довольно прост, так как все значения имеют одинаковое количество цифр, поэтому давайте попробуем более жесткий пример что делает мощность 10 шириной 8.

anim <- 25499:25504
x <- 10 ^ (0:5)

paste (и его вариант paste0) часто являются первыми функциями манипуляции с строками, с которыми вы сталкиваетесь , Они не предназначены для управления числами, но они могут быть использованы для этого. В простом случае, когда нам всегда нужно добавить один ноль, paste0 - лучшее решение.

paste0("0", anim)
## [1] "025499" "025500" "025501" "025502" "025503" "025504"

В случае, когда число цифр в цифрах имеет переменное число, вы должны вручную подсчитайте, сколько нулей нужно добавить, что достаточно ужасно, что вы должны делать это только из-за болезненного любопытства.


str_pad из stringr работает аналогично paste, что делает более явным то, что вы хотите проложить вещи.

library(stringr)
str_pad(anim, 6, pad = "0")
## [1] "025499" "025500" "025501" "025502" "025503" "025504"

Опять же, он не предназначен для использования с числами, поэтому для более сложного случая нужно немного подумать. Мы должны просто сказать «pad с нулями до ширины 8», но посмотрите на этот вывод:

str_pad(x, 8, pad = "0")
## [1] "00000001" "00000010" "00000100" "00001000" "00010000" "0001e+05"

Вам нужно установить опцию

str_pad(x, 8, pad = "0")
## [1] "00000001" "00000010" "00000100" "00001000" "00010000" "0001e+05"
для научного штрафа , чтобы

library(withr)
with_options(
  c(scipen = 999), 
  str_pad(x, 8, pad = "0")
)
## [1] "00000001" "00000010" "00000100" "00001000" "00010000" "00100000"

stri_pad в stringi работает точно так же, как str_pad из stringr ].


formatC является интерфейсом функции C printf . Использование этого требует некоторого знания арканы этой основной функции (см. Ссылку). В этом случае важными являются аргументы width, format - "d" для «integer» и "0" flag для добавочных нулей.

formatC(anim, width = 6, format = "d", flag = "0")
## [1] "025499" "025500" "025501" "025502" "025503" "025504"
formatC(x, width = 8, format = "d", flag = "0")
## [1] "00000001" "00000010" "00000100" "00001000" "00010000" "00100000"

Это мое любимое решение, так как легко изменить во времени с изменением ширины, и эта функция достаточно мощная, чтобы сделать другие изменения форматирования.


sprintf - это интерфейс к функции C с тем же именем; например formatC, но с другим синтаксисом.

sprintf("%06d", anim)
## [1] "025499" "025500" "025501" "025502" "025503" "025504"
sprintf("%08d", x)
## [1] "00000001" "00000010" "00000100" "00001000" "00010000" "00100000"

Основным преимуществом sprintf является то, что вы можете вставлять форматированные числа в более длинные фрагменты текста.

sprintf(
  "Animal ID %06d was a %s.", 
  anim, 
  sample(c("lion", "tiger"), length(anim), replace = TRUE)
)
## [1] "Animal ID 025499 was a tiger." "Animal ID 025500 was a tiger."
## [3] "Animal ID 025501 was a lion."  "Animal ID 025502 was a tiger."
## [5] "Animal ID 025503 was a tiger." "Animal ID 025504 was a lion." 

См. также товарный ответ .


Для полноты следует упомянуть другие функции форматирования, которые иногда полезны, но не имеют метода добавления нулей.

format , общую функцию для форматирования любого объекта, с методом для чисел. Он работает немного как formatC, но с еще одним интерфейсом.

prettyNum - еще одна функция форматирования, в основном для создания меток галочки с ручной осью. Он особенно хорошо работает для широкого диапазона чисел.

Пакет scales имеет несколько функций, таких как percent , date_format и dollar для специальных типов форматов.

390
ответ дан Richie Cotton 15 August 2018 в 17:14
поделиться
  • 1
    Большое спасибо за большую помощь. Я использовал formatC, чтобы добавить в нуль основные нули, и это сработало хорошо. – baz 28 April 2011 в 15:08
  • 2
    formatC (число или вектор, ширина = 6, формат = «d», флаг = «0») хорошо работает (R версия 3.0.2 (2013-09-25)). Благодарю. – Mohamad Fakih 8 October 2013 в 08:00
  • 3
    использование formatC () описанным выше способом не помогло мне. Он добавил пробелы вместо нулей. Я сделал что-то не так? Я использую R 3.1.1. – user1816679 15 September 2014 в 19:25
  • 4
    @ user1816679 Похоже, вы забыли flag = "0". – Richie Cotton 15 September 2014 в 19:36
  • 5
    В этом разделе описывается раздел «Сведения» справочной страницы ?sprintf. «m.n: два числа, разделенные периодом, обозначающие ширину поля (m) и точность (n)». – Richie Cotton 9 June 2016 в 04:38

str_pad из пакета stringr является альтернативой.

anim = 25499:25504
str_pad(anim, width=6, pad="0")
18
ответ дан kdauria 15 August 2018 в 17:14
поделиться
  • 1
    Будьте очень осторожны с str_pad, так как это может привести к неожиданным результатам. i.num = 600000; str_pad(i.num, width = 7, pad = "0") даст вам "006e + 05" и не "0600000" – Pankil Shah 19 June 2017 в 17:50

Развертывание в ответе @ goodside:

В некоторых случаях вам может понадобиться наложить строку с нулями (например, коды fips или другие числовые факторы). В OSX / Linux:

> sprintf("%05s", "104")
[1] "00104"

Но поскольку sprintf() вызывает команду C sprintf() ОС, обсуждаемую здесь здесь , в Windows 7 вы получаете другой результат:

> sprintf("%05s", "104")
[1] "  104"

Итак, на машинах Windows работа вокруг:

> sprintf("%05d", as.numeric("104"))
[1] "00104"
26
ответ дан metasequoia 15 August 2018 в 17:14
поделиться
  • 1
    По какой-то причине это решение больше не работает для меня в Linux. @ kdauria's str_pad теперь идет. – metasequoia 9 July 2016 в 19:44

Для общего решения, которое работает независимо от количества цифр в data$anim, используйте функцию sprintf. Он работает следующим образом:

sprintf("%04d", 1)
# [1] "0001"
sprintf("%04d", 104)
# [1] "0104"
sprintf("%010d", 104)
# [1] "0000000104"

В вашем случае вы, вероятно, захотите: data$anim <- sprintf("%06d", data$anim)

187
ответ дан MichaelChirico 15 August 2018 в 17:14
поделиться
  • 1
    Обратите внимание, что sprintf преобразует числовое значение в строку (символ). – aL3xa 28 April 2011 в 09:54
  • 2
    Спасибо за ответ. Я хочу сделать 13-значное число до 14 цифр (добавление начального нуля). Эта функция, похоже, не работает в этом случае. Это дает мне сообщение: Ошибка в sprintf («% 020d», 4000100000104): неверный формат «% 020d»; используйте формат% f,% e,% g или% a для числовых объектов. Любое предложение? – Rotail 4 August 2016 в 17:11
  • 3
    Попробуйте: sprintf («% 014.0f», 4000100000104) – smacdonald 22 September 2016 в 13:30
  • 4
    sprintf недоступен для R 3.4.1 – Frank FYC 19 September 2017 в 22:17
0
ответ дан Unheilig 15 August 2018 в 17:14
поделиться
Это означает, нотации.

Когда я попробовал ответ, предоставленный @metasequoia, возвращаемый вектор имел начальные пробелы, а не 0 s. Это была та же проблема, о которой упоминал @ user1816679 - и удаление цитат вокруг 0 или изменение с %d на %s тоже не имело значения. FYI, я использую 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 = .)

Я бы предпочел однофункциональное решение, но оно работает.

1
ответ дан Ursus Frost 15 August 2018 в 17:14
поделиться
data$anim <- sapply(0, paste0,data$anim)
2
ответ дан zhan2383 15 August 2018 в 17:14
поделиться
Другие вопросы по тегам:

Похожие вопросы: