Заставить R не использовать экспоненциальную запись (например, e + 10)?

229

Могу ли я заставить R использовать обычные числа вместо e+10обозначения -подобного типа? У меня есть:

1.810032e+09
# and 
4

в том же векторе и хотите увидеть:

1810032000
# and
4

Я создаю вывод для старомодной программы, и я должен написать текстовый файл, используя cat. Пока это отлично работает, но я просто не могу использовать e+10обозначения там.

Мэтт Баннерт
источник
Связанный: stackoverflow.com/q/3978266/134830
Ричи Коттон

Ответы:

228

Это немного серой области. Вы должны помнить, что R всегда будет вызывать метод печати, и эти методы печати прослушивают некоторые параметры. В том числе «scipen» - штраф за научный показ. От help(options):

'scipen': целое число. Штраф, применяемый при принятии решения о печати числовых значений в фиксированной или экспоненциальной записи. Положительные значения смещены в сторону фиксированных значений, а отрицательные - в сторону научных обозначений: предпочтительнее использовать фиксированные обозначения, если они не превышают цифры «scipen».

Пример:

R> ran2 <- c(1.810032e+09, 4) 
R> options("scipen"=-100, "digits"=4)
R> ran2
[1] 1.81e+09 4.00e+00
R> options("scipen"=100, "digits"=4)
R> ran2
[1] 1810032000          4

Тем не менее, я все еще нахожу это выдумкой. Самый прямой способ - использовать sprintf()с явной шириной, например sprintf("%.5f", ran2).

Дирк Эддельбюттель
источник
1
Спасибо. scipen, кажется, вариант, который я искал. Жуткое объяснение штрафа заставило меня уклониться. Но твой пример это хорошо объясняет. Спринтф, а? ты имеешь в виду проблемы с sprintf неделю назад? :)
Мэтт Баннерт
4
В rstudio, если вы импортируете набор данных и выполните train_sample_10k = format (train_sample_10k, Scientific = FALSE) и перезагрузите компьютер, это изменит научные нотации.
mixdev
Как мне вернуть вещи в нормальное состояние после этого?
AIM_BLB
6
@CSA: options("scipen"=0, "digits"=7)(это значения по умолчанию)
Scarabee
Вы должны переместить тот, который достигает результата, options("scipen"=100, "digits"=4)в верхнюю часть кода, а тот, который не ниже этого ... с соответствующими примечаниями. Это может сбить с толку кого-то, кто ищет быстрое решение (и Google показывает первое как результат).
xbsd
152

Это может быть достигнуто путем отключения научной записи в R.

options(scipen = 999)
GingerJack
источник
4
Более того, это можно поместить в ваш файл .Rprofile, чтобы он автоматически выполнялся по умолчанию.
smci
75

Мой любимый ответ:

format(1810032000, scientific = FALSE)
# [1] "1810032000"

Это дает то, что вы хотите, без необходимости копаться в настройках R.

Обратите внимание, что он возвращает символьную строку, а не числовой объект

Дэнни
источник
1
Хм, это странно, это не работает для меня. Я не получаю сообщение об ошибке, он просто печатает научную нотацию.
Ovi
Не уверен, что может быть не так. Я зарегистрировал очень старую (3.1.0) и новую (3.4.3) версию R, и она работает для меня в обоих. Скорее всего, какой-то другой параметр где-то имеет приоритет, или вы обнаружили ошибку в версии или в крайнем случае в R. Возможно ли, что вы вводите строку в научной записи, а не в числовой объект? Это объяснило бы это.
Дэнни
10
Возможно, примечательно, что это создает символ вместо числа.
Сенгель
3
Если числа в вашем векторе имеют разную длину, обязательно используйте их, justified = "none"иначе будут пробелы, дополняющие их до одинаковой длины.
Лорен Фитч
1
format(1e6, scientific=FALSE)возвращает "1000000"время as.character(1e6)возвращает "1e+06", поэтому есть разница между двумя методами.
Микки
7

Поместите options(scipen = 999) в свой файл .Rprofile чтобы он автоматически выполнялся по умолчанию . (Не полагайтесь на то, чтобы делать это вручную.)

(Это говорит что-то отличное от других ответов: как?

  1. Это сохраняет разум, когда вы переходите между несколькими проектами на нескольких языках ежедневно или ежемесячно. Не забывайте вводить настройки для каждого проекта, это подвержено ошибкам и не масштабируется. Вы можете иметь глобальный ~ / .Rprofile или для каждого проекта .Rprofile. Или и то, и другое, причем последнее перекрывает первое.
  2. Сохранение всех ваших настроек в проекте или глобальном .Rprofile автоматически выполняет его. Это полезно, например, для загрузки пакетов по умолчанию, конфигурации data.table, среды и т. Д. Опять же, эта конфигурация может работать на странице настроек, и есть нулевой шанс, что вы запомните их и их синтаксис и наберете их в
SMCI
источник
Почему точно такой же ответ? stackoverflow.com/a/27318351/680068 Помимо бита Rprofile, может быть, лучше отредактировать ответ GingerJack?
zx8754
@ zx8754: это не совсем тот же ответ: решающий момент - переместить этот материал в свой .Rprofile. Тогда ты никогда не забудешь это. Кроме того, со временем ваш .Rprofile накапливает все ваши настройки.
smci
1
Конечно, до вас, но вопрос не в том, «как я могу не забыть сделать Х», а в том, «как я могу сделать Х».
zx8754
@ zx8754: Я ежедневно переключаюсь между R и Python / pandas в нескольких проектах. У обоих есть настройки, пути к пакетам и т. Д. Это действительно делает разумным наличие одного общего конфигурационного файла, хранящего их. Через проекты.
smci
1
@ zx8754: когда вы работаете над несколькими проектами на нескольких языках, вопрос «как я могу сделать X» сливается с «как я не могу забыть сделать X» в масштабируемом, согласованном и автоматическом режиме. Я просто добавил больше объяснений. Для тех, кто ездит на даунвотере.
smci