Сохранение большого количества
Я пытаюсь прочитать файл 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
. Это то, что Джон описывает в своем ответе, поэтому ему следует обратиться к нему за освещением этого нюанса.
Ответ 3
попробуйте работать с colClasses = "character"
read.csv("file.csv", colClasses = "character")
http://stat.ethz.ch/R-manual/R-devel/library/utils/html/read.table.html
Посмотрите на эту ссылку.
Ответ 4
На странице "is.integer":
"Обратите внимание, что в текущих реализациях R используются 32-битные целые числа для целых векторов, поэтому диапазон представляемых целых чисел ограничен примерно +/- 2 * 10 ^ 9?
1665535004661L > 2 * 10 ^ 9 [1] ИСТИНА
Вам нужен пакет Rmpfr.
library(Rmpfr)
x <- mpfr(15, precBits= 1024)
Ответ 5
Взгляните на пакет int64
: Приведение 64-разрядных данных в R.
Ответ 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.
Это сохраняет значение длинных целых чисел и не смешивается с их представлением при импорте данных.