Длинные числа как строка символов
Как часть моего набора данных, один из столбцов представляет собой серию из 24-значных чисел.
Пример:
bigonumber <- 429382748394831049284934
Когда я импортирую его с помощью data.table::fread
или read.csv
, он отображается как числовой в экспоненциальном формате (EG: 4.293827e + 23).
options(digits=...)
не будет работать, так как число больше 22 цифр.
Когда я делаю
as.character(bigonumber)
что я получаю, это "4.29382748394831e + 23"
Есть ли способ получить bigonumber
преобразован в строку символов и показать все цифры в виде символов? Мне не нужно делать какие-либо математические данные, но мне нужно искать его, и на него присоединяется dplyr
.
Мне нужно это после импорта, так как число столбцов меняется от месяца к месяцу.
(Да, в идеальном мире мой поставщик данных по восходящему потоку будет использовать хеш вместо длинного числа и статическое количество столбцов, которые остаются неизменными каждый месяц, но я не могу их продиктовать им.)
Ответы
Ответ 1
Вы можете указать colClasses в вашем файле fread или read.csv.
bignums
429382748394831049284934
429382748394831049284935
429382748394831049284936
429382748394831049284937
429382748394831049284938
429382748394831049284939
bignums <- read.csv("~/Desktop/bignums.txt", sep="", colClasses = 'character')
Ответ 2
Вы можете подавить научную нотацию с помощью
options(scipen=999)
Если вы определяете число, то
bigonumber <- 429382748394831049284934
вы можете преобразовать его в строку:
big.o.string <- as.character(bigonumber)
К сожалению, это не работает, потому что R преобразует число в double, тем самым теряя точность:
#[1] "429382748394831019507712"
Последние цифры не сохраняются, как указано @SabDeM. Даже установка
options(digits=22)
не помогает, и в любом случае 22 является наибольшим допустимым числом; и в вашем случае 24 цифры. Таким образом, вам кажется, что вам нужно будет прочитать данные напрямую как символ или фактор. Были опубликованы большие ответы, показывающие, как это можно достичь.
В качестве побочного примечания есть пакет под названием gmp
, который позволяет использовать произвольно большие целочисленные числа. Однако есть улов: их нужно читать как символы (опять же, чтобы внутреннее преобразование R было двойным).
library(gmp)
bigonumber <- as.bigz("429382748394831049284934")
> bigonumber
Big Integer ('bigz') :
[1] 429382748394831049284934
> class(bigonumber)
[1] "bigz"
Преимущество состоит в том, что вы действительно можете рассматривать эти записи как числа и выполнять вычисления, сохраняя все цифры.
> bigonumber * 2
#Big Integer ('bigz') :
#[1] 858765496789662098569868
Этот пакет и мой ответ здесь могут не решить вашу проблему, потому что чтение чисел непосредственно в качестве символов - это более простой способ достижения вашей цели, но я думал, что могу опубликовать это в любом случае как информацию для пользователей, которым может потребоваться использование больших целые числа с более чем 22 цифрами.
Ответ 3
Использовать digest::digest
для bigonumber для генерации собственного хэша md5 самого числа?
bigonumber <- 429382748394831049284934
hash_big <- digest::digest(bigonumber)
hash_big
# "e47e7d8a9e1b7d74af6a492bf4f27193"
Ответ 4
Используйте "сканирование" для чтения файла - параметр "что" позволяет определить тип ввода для каждого столбца.
Ответ 5
Если вы хотите, чтобы числа в виде цифр вы не могли распечатать все значения. Параметры digits
позволяют не более 22 цифр. Диапазон от 1 до 22. Он использует метод print.default
. Вы можете установить его с помощью:
options( digits = 22 )
Даже с этими параметрами цифры будут меняться. Я игнорирую, почему это происходит, скорее всего, из-за того, что объект, который вы собираетесь распечатать (номер), длиннее допустимого количества цифр, и поэтому R делает некоторые странные вещи. Я расскажу об этом.
Ответ 6
Я видел это, прежде чем отправил свой ответ, но больше не вижу его здесь.
установите options(scipen)
в большое значение, чтобы не было усечения:
options(scipen = 999)
bigonumber <- 429382748394831049284934
bigonumber
# [1] 429382748394831019507712
as.character(bigonumber)
# [1] "429382748394831019507712"