Форматирование десятичных знаков в R

У меня есть номер, например 1.128347132904321674821, который я хотел бы отображать только двумя десятичными знаками при выводе на экран (или записи в файл). Как это сделать?

x <- 1.128347132904321674821

РЕДАКТИРОВАТЬ:

Использование:

options(digits=2)

Был предложен в качестве возможного ответа. Есть ли способ указать это в сценарии для одноразового использования? Когда я добавляю его в свой скрипт, он, кажется, не делает ничего другого, и меня не интересует частый повторный ввод для форматирования каждого числа (я автоматизирую очень большой отчет).

--

Ответ: раунд (x, цифры = 2)


person Brandon Bertelsen    schedule 09.08.2010    source источник
comment
Если использовать параметры (цифры = 4), это не ограничивает вычисления до 4 цифр, не так ли? В этом случае программы будут намного менее точными. Он влияет ТОЛЬКО на номер при печати, верно?   -  person MikeZ    schedule 02.08.2012
comment
controls the number of digits to print when printing numeric values. It is a suggestion only. Valid values are 1...22 with default 7. See the note in print.default about values greater than 15. из? Параметров он только влияет на вывод.   -  person Brandon Bertelsen    schedule 03.08.2012
comment
@PaulHurleyuk, я считаю хорошей практикой в ​​программировании использовать минимально возможное количество библиотек. Тот, кто использует другую библиотеку для каждой тривиальной потребности, обычно заканчивает беспорядок, большие файлы, проблемы с переносимостью и т. Д.   -  person Rodrigo    schedule 05.08.2013
comment
stackoverflow.com/ questions / 11228403 /   -  person M--    schedule 10.06.2017


Ответы (14)


Справочная информация: Некоторые ответы, предлагаемые на этой странице (например, signif, options(digits=...)), не гарантируют, что определенное количество десятичных знаков отображается для произвольного числа. Я предполагаю, что это конструктивная особенность R, при которой хорошая научная практика предполагает отображение определенного количества цифр на основе принципов "значащие цифры ". Однако во многих областях (например, стиль APA, бизнес-отчеты) требования к форматированию требуют, чтобы отображается определенное количество десятичных знаков. Часто это делается для обеспечения согласованности и стандартизации, а не для значимых цифр.

Решение:

Следующий код показывает ровно два десятичных знака для числа x.

format(round(x, 2), nsmall = 2)

Например:

format(round(1.20, 2), nsmall = 2)
# [1] "1.20"
format(round(1, 2), nsmall = 2)
# [1] "1.00"
format(round(1.1234, 2), nsmall = 2)
# [1] "1.12"

Более общая функция выглядит следующим образом, где x - число, а k - количество отображаемых десятичных знаков. trimws удаляет все начальные пробелы, что может быть полезно, если у вас есть вектор чисел.

specify_decimal <- function(x, k) trimws(format(round(x, k), nsmall=k))

E.g.,

specify_decimal(1234, 5)
# [1] "1234.00000"
specify_decimal(0.1234, 5)
# [1] "0.12340"
person Jeromy Anglim    schedule 27.08.2012
comment
+1 Единственный ответ, который сработал для меня, правильно печатает 0.0001 как 0.00 - person ThomasH; 06.12.2012
comment
Меня всегда беспокоило, как функции типа format() и prettyNum() преобразуют числа в символы. Как бы вы с этим справились? - person Waldir Leoncio; 06.03.2015
comment
Что с появившимися кавычками? - person F.Webber; 31.05.2017
comment
@ F.Webber переменная становится символьной скорее числовой. - person Jeromy Anglim; 01.06.2017
comment
А что насчет format(round(98082706897709.000098754390, 2), nsmall=2)? - person Simon Knapp; 11.09.2017
comment
@JeromyAnglim - Как округлить 8.1999999999999993 до 8.2? - person Chetan Arvind Patil; 19.10.2018
comment
@JeromyAnglim Я отмечаю, что приведенное выше решение имеет возможный недостаток крайнего случая, связанный с фиксацией количества символов перед десятичной дробью, например format(c(10, 1), nsmall=1) дает "10.0" " 1.0" (обратите внимание на начальный пробел перед 1.0. Принимая во внимание, что функция sprintf(), кажется, гарантирует лучшее форматирование с обеих сторон десятичной дроби, например, sprintf(c(10,1), fmt = '%#.1f') избавляется от этого надоедливого начального пробела и возвращает "10.0" "1.0". - person Nicholas G Reich; 31.10.2018
comment
кто-нибудь из вас мог бы помочь с этим? stackoverflow.com/q/53279593/5224236 - person CatalystRPA; 13.11.2018
comment
Начальные пробелы - это функция, предназначенная для выравнивания десятичной точки, когда результат format используется в столбце. - person Inhabitant; 25.05.2019
comment
format (round (0.9995, 2), nsmall = 2) дает 1.00, а substr (0.9995, 1, 3) дает 0.99. Вы можете использовать substr (число, 1, 2 + желаемые десятичные дроби) - person Federico Molina Magne; 12.11.2020
comment
Это неверный ответ. Он не всегда работает. Попробуйте это: параметры (цифры = 22); формат (круглый (1.1111111111111, 2), nsmall = 2) - person Feng Jiang; 24.04.2021

Вы можете отформатировать число, например x, до десятичных знаков по своему желанию. Здесь x - число с большим количеством десятичных знаков. Предположим, мы хотим отобразить до 8 десятичных знаков этого числа:

x = 1111111234.6547389758965789345
y = formatC(x, digits = 8, format = "f")
# [1] "1111111234.65473890"

Здесь format="f" дает числа с плавающей запятой в обычных десятичных разрядах, например, xxx.xxx, а digits указывает количество цифр. Напротив, если вы хотите получить целое число для отображения, вы должны использовать format="d" (очень похоже на sprintf).

person SORIF HOSSAIN    schedule 16.03.2016
comment
Хотя я не совсем понимаю, о чем именно спрашивал ОП, судя по самому высокому рейтингу ответа, я не мог не заметить, что formatC - это почти исключительно то, что я использую для этой цели. Я думаю, что этот ответ хорош и находится в базе R по запросу OP. - person AdamO; 27.12.2017
comment
кто-нибудь из вас мог бы помочь с этим? stackoverflow.com/q/53279593/5224236 - person CatalystRPA; 13.11.2018
comment
Этот ответ работает лучше, чем выбранный ответ. На форматC не влияют параметры (цифры) - person Feng Jiang; 24.04.2021

Вы можете попробовать мой пакет formattable.

> # devtools::install_github("renkun-ken/formattable")
> library(formattable)
> x <- formattable(1.128347132904321674821, digits = 2, format = "f")
> x
[1] 1.13

Хорошо то, что x по-прежнему числовой вектор, и вы можете выполнять больше вычислений с тем же форматированием.

> x + 1
[1] 2.13

Более того, цифры не теряются, вы можете переформатировать их в любое время :)

> formattable(x, digits = 6, format = "f")
[1] 1.128347
person Kun Ren    schedule 29.05.2015
comment
Такой крохотный укол беспокоил меня все утро. По какой-то причине R округлял отображение только для некоторого столбца. Мне нужно было это исправление, так как мне приходилось выполнять вычисления и для этих столбцов. Это работает. Спасибо ! - person thethakuri; 07.10.2016
comment
Мне нравится formattable, чем любые функции baseR. Самым большим преимуществом является сохранение числовой переменной. - person Lazarus Thurston; 16.10.2019

для 2 десятичных знаков, предполагая, что вы хотите сохранить конечные нули

sprintf(5.5, fmt = '%#.2f')

который дает

[1] "5.50"

Как упоминает @mpag ниже, кажется, что R может иногда давать неожиданные значения с помощью этого и круглого метода, например. sprintf (5.5550, fmt = '% #. 2f') дает 5.55, а не 5.56

person Mark Adamson    schedule 15.01.2018
comment
однако, хотя sprintf раундов, sprintf (5.5550, fmt = '% #. 2f') дает несколько неожиданный результат: 5.55. sprintf (5.555000000001, fmt = '% #. 2f') дает 5.56. Это, по-видимому, общая проблема с округлением в R, поскольку метод round, nsmall дает то же самое. - person mpag; 23.03.2018
comment
Спасибо @mpag, я понятия не имел, что R боролся с округлением границ, я только что попробовал с 5.565, который округляет вверх, а 5.545 округляет вниз. Я предполагаю, что это то, как они обрабатывают числа с плавающей запятой с точностью. Я не думаю, что видел такое поведение на других языках, что, как я полагаю, означает, что у них есть встроенный обходной путь. - person Mark Adamson; 25.03.2018
comment
Я думаю, скорее, они намеренно рассматривают значения как ограниченные по степени точности. Они полагают, что значение 5,555 на самом деле с такой же вероятностью возникло из реального значения 5,5546, как и 5,5554. Однако, если вы продолжите подобную игру с округлением, число 5.444445 может (непроверено) оказаться равным 6, если вы будете делать это по одной цифре за раз. Но, возможно, вы правы, что это может быть связано с тем, что двоичное представление немного меньше или превышает 5.55. - person mpag; 26.03.2018
comment
Да, я думаю, что если бы это было намеренно, это также было бы согласовано между 5.565 и 5.545. «Случайность» подсказывает мне, что это представление с плавающей запятой. - person Mark Adamson; 05.04.2018
comment
кто-нибудь из вас мог бы помочь с этим? stackoverflow.com/q/53279593/5224236 - person CatalystRPA; 13.11.2018

Что-то подобное :

options(digits=2)

Вариант определения цифр:

digits: controls the number of digits to print when printing numeric values.
person Xavier V.    schedule 09.08.2010
comment
Есть ли способ установить это динамически при запуске скрипта? - person Brandon Bertelsen; 10.08.2010
comment
Это работает для вывода в консоли R, но не работает в моем скрипте (они все еще выходят с .1289273982) - person Brandon Bertelsen; 10.08.2010
comment
У меня странное поведение, опция digits, похоже, не устанавливает количество цифр после десятичной дроби. Например, когда я устанавливаю параметры (цифры = 2), то печать 7.25 дает результат 7.2, 1234,25 становится 1234, а 0,25 остается 0,25. Есть ли другой вариант взаимодействия с этим? - person Maxim.K; 22.09.2014
comment
Это то, что вам определенно НЕ следует делать, если вам нужно всего лишь разовое использование. Варианты изменений повлияют на все. - person Feng Jiang; 24.04.2021

Проверьте функции prettyNum, format

чтобы иметь пробные нули (например, 123.1240), используйте sprintf(x, fmt='%#.4g')

person ilya    schedule 09.08.2010
comment
@ 42 Я бы посоветовал выучить sprintf, это в основном фреймворк для форматирования - person jangorecki; 24.03.2016
comment
@jangorecki Я не уверен в твоей точке зрения. Все, что я сделал (5+ лет назад), это предложил исправить орфографию. - person IRTFM; 24.03.2016
comment
@ 42 Я жду, что ты жалуешься на fmt аргумент, извини! - person jangorecki; 25.03.2016
comment
Я думаю, что OP после фиксированных десятичных знаков, а не фиксированных цифр. Кажется, что g в вашем ответе для фиксированных цифр, использование f работает лучше. - person Mark Adamson; 04.03.2018

Если вы предпочитаете значащие цифры фиксированным цифрам, тогда команда signif может быть полезно:

> signif(1.12345, digits = 3)
[1] 1.12
> signif(12.12345, digits = 3)
[1] 12.1
> signif(12345.12345, digits = 3)
[1] 12300
person PaulHurleyuk    schedule 09.08.2010
comment
Спасибо, Пол. Эти двое были не совсем тем, что я искал, но signif привел меня к round (), который мне и нужен. Ваше здоровье, - person Brandon Bertelsen; 10.08.2010
comment
signif работает для указанного числа, но я предполагаю, что общая прикладная проблема заключается в том, что вам нужно показать ровно два десятичных знака, но вы не знаете, какое число заблаговременно. В этом случае signif будет давать разное количество десятичных знаков в зависимости от фактического числа. - person Jeromy Anglim; 07.12.2012
comment
fix нигде не встречается. Пожалуйста, исправьте это, иначе этот вводящий в заблуждение ответ следует удалить. - person SmallChess; 24.04.2016
comment
@JeromyAnglim, как это исправить, если нам нужен 3sf? иногда это дает мне 3sf, иногда 4sf и т. д. как мы это исправить? - person christouandr7; 28.03.2020

Функцию formatC() можно использовать для форматирования числа до двух десятичных знаков. Эта функция дает два десятичных разряда, даже если результирующие значения включают нули в конце.

person Chernoff    schedule 26.04.2013

Я использую этот вариант для принудительной печати K десятичных знаков:

# format numeric value to K decimal places
formatDecimal <- function(x, k) format(round(x, k), trim=T, nsmall=k)
person Eldar Agalarov    schedule 14.04.2014

Обратите внимание, что числовые объекты в R хранятся с двойной точностью, что дает вам (примерно) 16 десятичных знаков. цифры точности - остальное будет шумом. Я допускаю, что приведенное выше число, вероятно, просто для примера, но оно состоит из 22 цифр.

person nullglob    schedule 10.08.2010
comment
Подтверждено, это просто для примера. Я размял клавиатуру. - person Brandon Bertelsen; 10.08.2010

Мне кажется, что это будет что-то вроде

library(tutoR)
format(1.128347132904321674821, 2)

Воспользуйтесь небольшой онлайн-справкой.

person Tim Meers    schedule 09.08.2010
comment
Я нашел это, но для этого нужен пакет, я ищу что-то в базовом пакете. - person Brandon Bertelsen; 10.08.2010
comment
@brandon, format () является частью базы. Откройте R и введите? Format ... пакеты не нужны. - person JD Long; 10.08.2010
comment
Хмммм, вы смотрели, что это за выводы? [1] 1.128347 в противном случае, вы совершенно правы, что он находится в базовом пакете, мое плохое. - person Brandon Bertelsen; 10.08.2010
comment
Возможно, попробуйте format.default(x, digits = 2) просто сделать снимок в темноте, основываясь на предоставленной ссылке. Этой информации не хватает в том, что я обычно читаю для документации, я ожидал увидеть и распечатанные результаты. - person Tim Meers; 10.08.2010
comment
Просто заметил, что ваша ссылка указывает на документацию tutoR, которая не является частью базы. - person Brandon Bertelsen; 10.08.2010
comment
Просто удивительно, сколько раз формат оказывается правильным ответом. Как я подозреваю, вы знаете, у него есть большое количество методов, но другие должны попробовать methods(format). - person IRTFM; 27.08.2012
comment
format(0.0002, 2) будет выводить 0 вместо 0.00, что, как я полагаю, было задумано. - person ThomasH; 06.12.2012

если вы просто хотите округлить число или список, просто используйте

round(data, 2)

Затем данные будут округлены до 2 десятичных знаков.

person jared    schedule 05.07.2018

вот мой подход от единиц к миллионам. Параметр digits позволяет мне настроить минимальное количество значащих значений (целое число + десятичные знаки). Вы можете сначала настроить десятичное округление внутри.

number <-function(number){
  result <- if_else(
    abs(number) < 1000000,
    format(
      number, digits = 3,
      big.mark = ".",
      decimal.mark = ","
    ),
    paste0(
      format(
        number/1000000,
        digits = 3,
        drop0trailing = TRUE,
        big.mark = ".",
        decimal.mark = ","
      ),
      "MM"
    )
  )
  # result <- paste0("$", result)
  return(result)
}
person Captain Tyler    schedule 27.11.2020

Я написал эту функцию, которую можно улучшить, но, похоже, она хорошо работает в крайних случаях. Например, в случае 0,9995 правильный ответ на голосование дает нам 1,00, что неверно. Я использую это решение в том случае, если в числе нет десятичных знаков.

round_correct <- function(x, digits, chars = TRUE) {
  if(grepl(x = x, pattern = "\\.")) {
    y <- as.character(x)
    pos <- grep(unlist(strsplit(x = y, split = "")), pattern = "\\.", value = FALSE)
    if(chars) {
      return(substr(x = x, start = 1, stop = pos + digits))
    }
    return(
      as.numeric(substr(x = x, start = 1, stop = pos + digits))
    )
  } else {
    return(
      format(round(x, 2), nsmall = 2)
    )
  }
}

Пример:

round_correct(10.59648, digits = 2)
[1] "10.59"
round_correct(0.9995, digits = 2)
[1] "0.99"
round_correct(10, digits = 2)
[1] "10.00"
person Federico Molina Magne    schedule 08.04.2021