Вопрос по r – Сохранение больших чисел

11

Я пытаюсь прочитать CSV-файл с штрих-кодами в первом столбце, но когда R получает его в data.frame, он преобразует1665535004661 в1.67E+12.

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

Ваш Ответ

7   ответов
3
x & lt; - "1665535004661"
Есть ли способ просто импортировать его как символ? Мне не нужно заниматься математикой, мне просто нужно разобраться с этим. James
8

read.csv("file.csv", colClasses = "character")

http://stat.ethz.ch/R-manual/R-devel/library/utils/html/read.table.html

Посмотрите на эту ссылку.

4

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

1665535004661L > 2*10^9 [1] TRUE

Вы хотите пакет Rmpfr.

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

он просто не будет печатать полностью с использованием значений по умолчанию. R читает это очень хорошо, и целое число там.

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

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

Хороший вопрос - отредактировал мой ответ, чтобы быть более ясным об этом Не стесняйтесь настраивать дальше, если считаете нужным. Ура! - Гнаться
Это существенно отменяет метод, который я обсуждаю нижеoptions(), В качестве ориентира следует прочитать и учесть предупреждение в?print.default так как реализация с & gt; = 16 цифрами начинает становиться специфичной для платформы проблемой, поскольку реализацияsprintf() начинает различаться в зависимости от базового кода C.
То же самое верно, если вы используете options (). Это только выходной сигнал по умолчанию. Я думаю, что было бы лучше, если бы вы прямо указали на это в своем ответе. Это довольно расплывчато. Пытаясь прочитать это наивно, мне интересно, просто ли опция цифр изменяет количество сохраняемых цифр, как они читаются? ... что?
3

read.csv, Так, например:

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

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

11

что вы сказали в комментариях, вы можете напрямую импортировать текст как символ, указав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, Это то, что Джон описывает в своем ответе, поэтому следует отдать ему должное за освещение этого нюанса.

2

символ подходит. Вы можете использовать аргумент 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"

Похожие вопросы