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

264

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

x <- 1.128347132904321674821

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

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

options(digits=2)

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

-

Ответ: круглый (х, цифры = 2)

Брэндон Бертельсен
источник
1
Связанный вопрос: stackoverflow.com/questions/2287616/…
Шейн
Если использовать параметры (цифры = 4), это не ограничивает вычисления до 4 цифр, не так ли? В этом случае это сделает программы гораздо менее точными. Это влияет ТОЛЬКО на номер при печати, правильно?
MikeZ
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.из параметров? это влияет только на вывод.
Брэндон Бертельсен
Обратите внимание, что round(23, digits=2)будет печатать, 23а не 23.00. Если вы хотите последнее, попробуйте stackoverflow.com/a/12135122/180892
Jeromy Anglim
4
@PaulHurleyuk, я думаю, что хорошей практикой в ​​программировании является использование как можно меньшего количества библиотек. Кто-то, кто использует разные библиотеки для каждой тривиальной задачи, обычно сталкивается с беспорядком, большими файлами, проблемами с переносимостью и т. Д.
Родриго

Ответы:

381

Справочная информация : Некоторые ответы , предложенные на этой странице (например, 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"
Джером англим
источник
4
+1 Только ответ, который работал для меня, правильно печатает 0.0001как0.00
ThomasH
7
Это всегда беспокоило меня , как такие функции , как format()и prettyNum()преобразовать в числовые символы. Как бы вы решили это?
Вальдир Леонсио
Что с кавычками, которые появляются?
Ф.Веббер,
2
@JeromyAnglim Я отмечаю, что решение, приведенное выше, имеет возможный недостаток в крайнем случае, заключающийся в фиксировании количества символов перед десятичной дробью, например, format(c(10, 1), nsmall=1)выходов "10.0" " 1.0"(обратите внимание на начальный пробел перед 1.0. При этом sprintf()функция, кажется, гарантирует более приятное форматирование на обе стороны десятичного знака, например , sprintf(c(10,1), fmt = '%#.1f')избавляется от этого противного ведущего пространства и возвращается "10.0" "1.0".
Николас G Reich
1
Начальные пробелы - это функция, предназначенная для выравнивания десятичной точки, когда результат formatиспользуется в столбце.
Житель
34

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

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

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

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

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

> # 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
Кун Рен
источник
Такой крошечный укол мучил меня все утро. По какой-то причине R округляет отображение только для некоторого столбца. Мне нужно было это исправление, так как я также должен был выполнять вычисления для этих столбцов. Это работает. Спасибо !
thethakuri
Мне нравится форматирование, чем любые функции baseR. Самым большим преимуществом является сохранение переменной как числовой.
Лазарь Терстон
22

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

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 дает то же самое.
mpag
Спасибо @mpag, я понятия не имел, что R боролся с округлением на границах, я только что попробовал это с 5.565, который округляет вверх, а 5.545 округляет вниз. Я предполагаю, что это способ, которым они обрабатывают неточность с плавающей запятой. Я не думаю, что видел такое поведение на других языках, что, я думаю, означает, что у них есть встроенный обходной путь
Марк Адамсон,
Я скорее думаю, что они намеренно рассматривают ценности как ограниченные в степени точности. Они выясняют, что значение, равное 5,555, на самом деле с той же вероятностью является результатом "реального" значения 5,5546, что и 5,5554. Однако, если вы продолжите игру с округлением, 5.444445 (непроверенный) может закончиться как «6», если вы сделаете это по одной цифре за раз. Но вы можете быть правы, что это может быть связано с тем, что двоичное представление немного меньше или превышает 5.55.
mpag
Да, я думаю, что если бы это было преднамеренно, это также было бы согласовано между 5.565 и 5.545. «Случайность» подсказывает мне, что это представление с плавающей запятой.
Марк Адамсон
Кто-нибудь из вас может помочь с этим? stackoverflow.com/q/53279593/5224236
gpier
8

Что-то такое :

options(digits=2)

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

digits: controls the number of digits to print when printing numeric values.
Ксавье В.
источник
Есть ли способ установить это динамически при запуске скрипта?
Брэндон Бертельсен
Это работает для вывода в консоли R, но не работает в моем сценарии (они все еще выходят с .1289273982)
Брэндон Бертельсен,
1
Я получаю странное поведение, digitsопция, кажется, не устанавливает количество цифр после десятичной дроби. Например, когда я устанавливаю параметры (цифры = 2), то при печати 7,25 получается результат 7,2, 1234,25 становится 1234, а 0,25 остается 0,25. Есть ли другой вариант взаимодействия с этим?
Maxim.K
8

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

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

илья
источник
@ 42 Я бы sprintf
посоветовал
1
@jangorecki Я не уверен в твоей точке зрения. Все, что я делал (5+ лет назад), предлагал исправить орфографию.
IRTFM
@ 42 Я жалею, что ты жалуешься на fmtаргумент, извини!
Джангорецкий
Я думаю, что ОП после фиксированных десятичных разрядов, а не фиксированных цифр. Кажется, что gв вашем ответе для фиксированных цифр, использование fработает лучше.
Марк Адамсон
5

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

> signif(1.12345, digits = 3)
[1] 1.12
> signif(12.12345, digits = 3)
[1] 12.1
> signif(12345.12345, digits = 3)
[1] 12300
PaulHurleyuk
источник
1
Спасибо, Пол. Эти два были не совсем то, что я искал, но знаменательное привело меня к round (), что именно то, что мне нужно. Ура,
Брэндон Бертельсен
34
Error: could not find function "fixed"
ThomasH
signifработает для указанного числа, но я предполагаю, что общая прикладная проблема заключается в том, когда вам нужно показать ровно два десятичных знака, но вы не знаете, какое число опережает время. В этом случае signifбудет дано различное количество десятичных знаков в зависимости от фактического числа.
Джером Энглим
3
исправлено не найдено нигде. Пожалуйста, исправьте это, иначе этот вводящий в заблуждение ответ должен быть удален.
HelloWorld
@JeromyAnglim как мы можем это исправить, когда мы хотим 3sf? иногда это дает мне 3sf, иногда 4sf и т. д. как мы можем это исправить?
christouandr7
4

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

Чернов
источник
3

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

# format numeric value to K decimal places
formatDecimal <- function(x, k) format(round(x, k), trim=T, nsmall=k)
Эльдар Агаларов
источник
2

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

nullglob
источник
3
Подтверждено, это только для примера. Я нажал на клавиатуре.
Брэндон Бертельсен
1

Похоже, мне бы хотелось что-то вроде

library(tutoR)
format(1.128347132904321674821, 2)

За небольшую онлайн помощь .

Тим Меерс
источник
Я нашел это, но это требует пакета, я ищу что-то в базовом пакете.
Брэндон Бертельсен
2
@brandon, format () является частью базы. Откройте R и введите? Format ... пакеты не нужны.
JD Long
Хммм, вы смотрели на что это выходы? [1] «1.128347» в противном случае, вы совершенно правы в том, что это в базовой комплектации, мой плохой.
Брэндон Бертельсен
1
Возможно, попробуйте format.default(x, digits = 2)просто выстрел в темноте, хотя на основе предоставленной ссылки. Эта информация - то, чего не хватает из того, что я обычно читаю для документации, я ожидал увидеть и печатные материалы.
Тим Меерс
Просто заметил, что ваша ссылка указывает на документацию tutoR, которая не является частью базы.
Брэндон Бертельсен
1

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

round(data, 2)

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

Jared
источник