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

185

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

x <- 1.128347132904321674821

ИЗМЕНИТЬ:

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

options(digits=2)

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

-

Ответ: round (x, digits = 2)

  • 1
    Похожий вопрос: stackoverflow.com/questions/2287616/…
  • 0
    хаха, спасибо Шейн. Хотя, опять же, я должен указать, что искал что-то в базе R.
Показать ещё 8 комментариев
Теги:
rounding
formatting

12 ответов

267
Лучший ответ

Фон: Некоторые ответы, предлагаемые на этой странице (например, 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))

например.

specify_decimal(1234, 5)
# [1] "1234.00000"
specify_decimal(0.1234, 5)
# [1] "0.12340"
  • 3
    +1 Только ответ, который работал для меня, правильно печатает 0.0001 как 0.00
  • 7
    Меня всегда беспокоило, как такие функции, как format() и prettyNum() преобразуют цифры в символы. Как бы вы решили это?
Показать ещё 7 комментариев
18

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

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

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

  • 0
    Хотя мне неясно, о чем конкретно спрашивал ОП, судя по ответу с самым высоким рейтингом, я не мог не заметить, что formatC - это почти исключительно то, что я использую для этой цели. Я думаю, что этот ответ хороший и находится в базе R согласно запросу ОП.
  • 0
    Кто-нибудь из вас может помочь с этим? stackoverflow.com/q/53279593/5224236
14

Вы можете попробовать мой пакет 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
  • 0
    Такой крошечный укол не давал мне покоя все утро. По какой-то причине R округляет отображение только для некоторого столбца. Мне нужно было это исправление, так как я также должен был выполнять вычисления для этих столбцов. Это работает. Спасибо !
7

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

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

который дает

[1] "5.50"

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

  • 1
    однако, хотя sprintf округляется, sprintf (5.5550, fmt = '% #. 2f') дает немного неожиданный результат: 5.55. sprintf (5.555000000001, fmt = "% #. 2f") дает 5,56. Похоже, что это общая проблема с округлением в R, так как метод round, nsmall дает то же самое.
  • 0
    Благодаря @mpag, я понятия не имел, что R боролся с округлением на границах, я только что попробовал это с 5.565, который округляет вверх, а 5.545 округляет вниз. Я предполагаю, что это способ, которым они обрабатывают неточность с плавающей запятой. Я не думаю, что видел такое поведение на других языках, что, я думаю, означает, что они имеют встроенный обходной путь
Показать ещё 3 комментария
5

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

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

  • 0
    ITYM `... fmt = '% #. 4g')
  • 0
    @ 42 Я бы выступил за изучение sprintf , это в основном рамки для форматирования
Показать ещё 3 комментария
4

Ну, два, которые приходят на ум,

fixed(1.128347132904321674821, digits=2)

или если вы предпочитаете сильные цифры для фиксированных цифр, то

signif(1.128347132904321674821,digits=3)
  • 1
    Спасибо, Пол. Эти два были не совсем то, что я искал, но знаменательное привело меня к round (), что именно то, что мне нужно. Ура,
  • 34
    Error: could not find function "fixed"
Показать ещё 2 комментария
4

Что-то вроде этого:

options(digits=2)

Определение опций цифр:

digits: controls the number of digits to print when printing numeric values.
  • 0
    Есть ли способ установить это динамически при запуске скрипта?
  • 0
    Это работает для вывода в консоли R, но не работает в моем сценарии (они все еще выходят с .1289273982)
Показать ещё 1 комментарий
3

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

2

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

# format numeric value to K decimal places
formatDecimal <- function(x, k) format(round(x, k), trim=T, nsmall=k)
2

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

  • 2
    Подтверждено, это только для примера. Я нажал на клавиатуре.
1

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

library(tutoR)
format(1.128347132904321674821, 2)

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

  • 0
    Я нашел это, но это требует пакета, я ищу что-то в базовом пакете.
  • 2
    @brandon, format () является частью базы. Откройте R и введите? Format ... пакеты не нужны.
Показать ещё 5 комментариев
0

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

round(data, 2)

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

Ещё вопросы

Сообщество Overcoder
Наверх
Меню