Одна из вещей, которая раньше смущала меня как новичка в R, заключалась в том, как отформатировать число в процентах для печати.
Например, отобразить 0.12345
как 12.345%
. У меня есть несколько обходных путей для этого, но ни один из них не кажется "дружелюбным для новичков". Например:
set.seed(1)
m <- runif(5)
paste(round(100*m, 2), "%", sep="")
[1] "26.55%" "37.21%" "57.29%" "90.82%" "20.17%"
sprintf("%1.2f%%", 100*m)
[1] "26.55%" "37.21%" "57.29%" "90.82%" "20.17%"
Вопрос: есть ли для этого базовая функция R? В качестве альтернативы, существует ли широко используемый пакет, обеспечивающий удобную оболочку?
Несмотря на поиски чего - то , как это в ?format
, ?formatC
и ?prettyNum
я до сих пор найти подходяще удобную оболочку в базе R. ??"percent"
ничего полезного не даст. library(sos); findFn("format percent")
возвращает 1250 совпадений - снова бесполезно. ggplot2
есть функция, percent
но она не позволяет контролировать точность округления.
источник
sprintf
кажется, это любимое решение в списках рассылки, и я не видел лучшего решения. Все равно вызвать встроенную функцию будет не так просто, верно?sprintf
это прекрасно подходит для той части R-кодеров, которые тоже являются программистами. Я много кодировал в своей жизни, в том числе COBOL (вздрагивает) и fortran (показывает мой возраст). Но я не считаюsprintf
правила форматирования очевидными (перевод: WTF?). И, конечно же, специальную оболочку должно быть проще вызвать, чем sprintf, например:format_percent(x=0.12345, digits=2)
sprintf()
вряд ли займет больше времени, чем выяснение того, что пакет foo содержитformat_percent()
. Что произойдет, если пользователь хочет форматировать не в процентах, а в чем-то похожем? Им нужно найти другую обертку. В конечном итоге изучение базовых инструментов принесет пользу.%
, что символ комментария в LaTeX, который является форматом отчетности "по умолчанию" для R. Таким образом, хотя он может быть полезен для маркировки графиков, необходимо соблюдать осторожность, если форматируемое число должно быть свернуто.Ответы:
Даже позже:
Как указывает @DzimitryM,
percent()
был «удален» в пользуlabel_percent()
, что является синонимом старойpercent_format()
функции.label_percent()
возвращает функцию, поэтому для ее использования вам понадобится пара дополнительных скобок.Настройте это, добавив аргументы внутри первого набора круглых скобок.
Обновление, несколько лет спустя:
В наши дни
percent
вscales
пакете есть функция , как описано в ответе krlmlr. Используйте это вместо моего решения, скрученного вручную.Попробуйте что-то вроде
При использовании, например,
(Если хотите, измените формат с
"f"
на"g"
.)источник
scales
вер. Руководство 1.1.0 сообщает:percent()
удалено; используйтеlabel_percent()
вместо этого, что не подходит для форматирования чисел . Так что ручное решение еще актуальноОзнакомьтесь с
scales
пакетом.ggplot2
Думаю, раньше это было частью .Встроенная логика для определения точности должна работать достаточно хорошо для большинства случаев.
источник
percent(-0.1)
производитNaN%
scales::percent(c(-0.1, -0.2))
scales::percent(c(-0.1,-0.1,-0.1))
производит,"NaN%" "NaN%" "NaN%"
но ваш пример работает. Для справки, ошибка еще не исправленаscales_0.2.4
. Кроме того, на сегодняшний день соответствующее исправление запроса на перенос еще не объединено с основной веткой.Ознакомьтесь с
percent
функцией изformattable
пакета:источник
scales::percent
в первых двух ответах нет.Я сделал некоторые бенчмаркинг скорости на этих ответов и был удивлен увидеть
percent
вscales
пакете так расхваливали, учитывая его инерционность. Я полагаю, что преимуществом является его автоматический детектор для правильного форматирования, но если вы знаете, как выглядят ваши данные, кажется, что этого следует избегать.Вот результаты попытки отформатировать список из 100000 процентов в (0,1) до процента в 2 цифры:
Таким образом
sprintf
становится очевидным победителем, когда мы хотим добавить знак процента. С другой стороны, если мы хотим только умножить число и округлить (перейти от пропорции к проценту без "%", тоround()
будет быстрее:источник
Вы можете использовать пакет scale только для этой операции (не загружая его с помощью require или библиотеки)
источник
Вот мое решение для определения новой функции (в основном, чтобы я мог поиграть с Curry и Compose :-)):
источник
Увидев, как
scalable::percent
уже было показано, что он самый медленный, и Лилиана Пачеко предлагает другое решение, я пошел дальше и попытался сравнить его с некоторыми другими вариантами на основе примера, приведенного Майклом:Вот результаты, которые я получил:
Я понятия не имею, почему мой
krlmlr()
иandrie1()
выступил намного хуже, чем в примере с Михаэлем Кирико. Есть какие-нибудь подсказки?источник
источник
Эта функция может преобразовывать данные в проценты по столбцам
источник
base2[, j] = base[ , j] * 100 / suma.c
. Также стоит отметить, что это не совсем ответ на вопрос ... вопрос заключается в форматировании чего-то вроде0.5
"50,0%", а не в вычислении ...tidyverse
Версия такова:Выглядит как всегда аккуратно.
источник