Сохранение большого количества

Я пытаюсь прочитать файл csv, который имеет штрих-коды в первом столбце, но когда R попадает в файл data.frame, он преобразует "1665535004661" в "1.67E + 12". Есть ли способ сохранить это число в целочисленном формате? Я попытался назначить класс "double", но это не сработало и не присвоило класс "character". Как только он находится в формате 1.67E + 12, любая попытка его преобразования в целое число возвращает "167000000000".

Спасибо, J -

Ответ 1

Он не в формате "1.67E + 12", он просто не будет печатать полностью, используя значения по умолчанию. R читает его просто отлично, и там есть все.

x <- 1665535004661
> x
[1] 1.665535e+12
> print(x, digits = 16)
[1] 1665535004661

Видите, цифры были там все время. Они не теряются, если у вас нет действительно большого количества цифр. Сортировка на том, что вы принесли, будет работать нормально, и вы можете просто явно вызвать print() с опцией цифр, чтобы вместо вашего неявного видения вашего data.frame, набрав имя.

Ответ 2

Подбирая то, что вы сказали в комментариях, вы можете напрямую импортировать текст в качестве символа, указав colClasses в read.table(). Например:

num <- "1665535004661"
dat.char <- read.table(text = num, colClasses="character")
str(dat.char)
#------
'data.frame':   1 obs. of  1 variable:
 $ V1: chr "1665535004661"
dat.char
#------
             V1
1 1665535004661

Альтернативно (и для других целей) вы можете указать переменную digits в разделе options(). Значение по умолчанию - 7 цифр, а допустимый диапазон - 1-22. Чтобы быть ясным, установка этой опции никоим образом не изменяет или не изменяет базовые данные, она просто контролирует, как она отображается на экране при печати. На странице справки для ?options:

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.

Пример, иллюстрирующий это:

options(digits = 7)
dat<- read.table(text = num)

dat
#------
            V1
1 1.665535e+12

options(digits = 22)
dat
#------
             V1
1 1665535004661

Чтобы полностью реализовать это и учитывать случаи, когда настройка глобального параметра не является предпочтительной, вы можете напрямую указывать цифры в качестве аргумента print(foo, digits = bar). Подробнее об этом можно узнать в разделе ?print.default. Это то, что Джон описывает в своем ответе, поэтому ему следует обратиться к нему за освещением этого нюанса.

Ответ 4

На странице "is.integer":

"Обратите внимание, что в текущих реализациях R используются 32-битные целые числа для целых векторов, поэтому диапазон представляемых целых чисел ограничен примерно +/- 2 * 10 ^ 9?

1665535004661L > 2 * 10 ^ 9 [1] ИСТИНА

Вам нужен пакет Rmpfr.

library(Rmpfr)
x <- mpfr(15, precBits= 1024)

Ответ 6

Поскольку вы не выполняете арифметику по этому значению, символ подходит. Вы можете использовать аргумент colClasses для установки различных классов для каждого столбца, что, вероятно, лучше, чем использование всех символов.

data.csv:

a,b,c
1001002003003004,2,3

Прочитать символ, затем целые числа:

x <- read.csv('test.csv',colClasses=c('character','integer','integer'))
x
                 a b c
1 1001002003003004 2 3


mode(x$a)
[1] "character"

mode(x$b)
[1] "numeric"

Ответ 7

Вы можете использовать аргументы цифр, когда делаете read.csv. Так, например:

read.csv(x, sep = ";", numerals = c("no.loss")) Where x is your data.

Это сохраняет значение длинных целых чисел и не смешивается с их представлением при импорте данных.