Подтвердить что ты не робот

Длинные числа как строка символов

Как часть моего набора данных, один из столбцов представляет собой серию из 24-значных чисел.

Пример:

bigonumber <- 429382748394831049284934

Когда я импортирую его с помощью data.table::fread или read.csv, он отображается как числовой в экспоненциальном формате (EG: 4.293827e + 23).

options(digits=...) не будет работать, так как число больше 22 цифр.

Когда я делаю

as.character(bigonumber) 

что я получаю, это "4.29382748394831e + 23"

Есть ли способ получить bigonumber преобразован в строку символов и показать все цифры в виде символов? Мне не нужно делать какие-либо математические данные, но мне нужно искать его, и на него присоединяется dplyr.

Мне нужно это после импорта, так как число столбцов меняется от месяца к месяцу.

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

4b9b3361

Ответ 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"