Форматирование десятичных знаков в 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

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 цифр.


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 десятичных знаков.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.