long / bigint / десятичный эквивалентный тип данных в R

Какие варианты типов данных мы должны обрабатывать большие числа в R? По умолчанию размер целых чисел составляет 32 бита, поэтому большие числа из sql-сервера, а также любые большие числа, переданные из python через rpy2, становятся искалеченными.

> 123456789123 [1] 123456789123 > 1234567891234 [1] 1.234568e+12 

При чтении значения bigint 123456789123456789 с использованием RODBC он возвращается как 123456789123456784 (см. Последнюю цифру), и тот же номер при десериализации через RJSONIO возвращается как -1395630315L (что кажется дополнительной ошибкой / ограничением RJSONIO).

 > fromJSON('[1234567891]') [1] 1234567891 > fromJSON('[12345678912]') [1] -539222976 

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

См. help(integer) :

  Note that on almost all implementations of R the range of representable integers is restricted to about +/-2*10^9: 'double's can hold much larger integers exactly. 

поэтому я бы рекомендовал использовать numeric (т.е. «double») – число с двойной точностью.

Я понял ваш вопрос немного по-другому против двух, которые были опубликованы до того, как я это сделал.

Если наибольшее значение по умолчанию для R для вас мало, у вас есть несколько вариантов (отказ от ответственности: я использовал каждую из библиотек, о которых я упоминал ниже, но не через привязки R, а не через другие языковые привязки или собственную библиотеку)

Пакет Brobdingnag : использует натуральные журналы для хранения значений; (например, Rmpfr, реализованный с использованием новой структуры classа R). Меня всегда поражает любой, чья работа требует таких масштабов.

 library(Brobdingnag) googol <- as.brob(1e100) 

Пакет gmp : привязки R к почтенной GMP (библиотека многоточечной GNU). Это должно пройти 20 лет, потому что я использовал его в университете. Девиз этой библиотеки - «Арифметика без ограничений», которая является надежным требованием - целыми числами, рациональными вычислениями, плаваниями и т. Д., Вплоть до пределов ОЗУ на вашем ящике.

 library(gmp) x = as.bigq(8000, 21) 

Пакет Rmpfr : привязки R, которые взаимодействуют как с gmp (выше), так и с MPFR (MPFR, в свою очередь, представляет собой современную реализацию gmp. Я использовал привязки Python («bigfloat») и могу рекомендовать ее высоко. вариант из трех, учитывая его сферу охвата, учитывая, что он, по-видимому, наиболее активно поддерживается и, наконец, дает то, что представляется наиболее полной документацией.

Примечание. Чтобы использовать любой из двух последних, вам необходимо установить собственные библиотеки, GMP и MPFR .

После того, как этот вопрос был задан, теперь доступны пакеты int64 от Romain Francois и bit64 от Jens Oehlschlägel.

Дирк прав. Вы должны использовать numeric тип (который должен быть установлен в double). Другое дело, что вы можете не возвращать все цифры. Посмотрите на настройку цифр:

 > options("digits") $digits [1] 7 

Вы можете расширить это:

 options(digits=14) 

Кроме того, вы можете переформатировать номер:

 format(big.int, digits=14) 

Я проверил ваш номер и получаю то же поведение (даже используя double тип данных), так что это может быть ошибка:

 > as.double("123456789123456789") [1] 123456789123456784 > class(as.double("123456789123456789")) [1] "numeric" > is.double(as.double("123456789123456789")) [1] TRUE 

Я исправил несколько вопросов, связанных с целыми числами в rpy2 (Python может swich от int до долгого времени, когда это необходимо, но R, похоже, не в состоянии это сделать. Целочисленные переполнения теперь должны возвращать NA_integer_.

L.

Я пытался найти обходной путь для этого вопроса за последние два дня, и, наконец, я нашел его сегодня. У нас есть идентификаторы длиной 19 цифр в нашей базе данных SQL, и ранее я использовал RODBC для получения данных bigint с сервера. Я попробовал int64 и bit64, а также определенные параметры (цифры = 19), но RODBC продолжал давать проблемы. Я заменил RODBC на RJDBC, и, получая данные bigint с SQL-сервера, я манипулировал SQL-запросом, используя литье данных bigint в строку.

Итак, вот пример кода:

 #Include stats package require(stats); library(RJDBC); #set the working directory setwd("W:/Users/dev/Apps/R/Data/201401_2"); #Getting JDBC Driver driver <- JDBC("com.microsoft.sqlserver.jdbc.SQLServerDriver", "W:/Users/dev/Apps/R/Data/sqljdbc/enu/sqljdbc4.jar"); #Connect with DB connection <- dbConnect(driver, "jdbc:sqlserver://DBServer;DatabaseName=DB;", "BS_User", "BS_Password"); #Query string sqlText <- paste("SELECT DISTINCT Convert(varchar(19), ID) as ID FROM tbl_Sample", sep=""); #Execute query queryResults <- dbGetQuery(connection, sqlText); 

С помощью этого решения я получил данные bigint без каких-либо изменений, но он не работал с RODBC. Теперь скорость взаимодействия SQL-сервера с R повлияла, потому что RJDBC медленнее RODBC, но это не так уж плохо.

Есть много вариантов, которые вы можете использовать для R для большого числа. Вы также можете использовать as.numeric (). Проблема с as.numeric () заключается в том, что я нашел ошибку в функции для версии R 3.02. Если вы умножаете числа, используя тип данных as.numeric (), и числа, получившие результат, который составляет около 16 цифр, вы получите результат ошибки. Эта ошибка as.numeric () была протестирована против многих библиотек.

Есть еще один вариант.

Я написал две программы для R, один называется infiX, а другой – infiXF для R. Эта библиотека в настоящее время поддерживает только вычисление умножения. Оба они вычисляют числа до точного десятичного знака. Испытано 100 000 раз. infiX будет обрабатывать номер в строчном формате, где infiXF перенесет его на базу файловой системы.

Когда вы храните номер в памяти, вы ограничены 8 – 128 Гб в зависимости от вашей памяти. Иногда даже меньше, если компилятор не позволяет использовать все доступные ресурсы. Когда вы вычисляете числа на базе текстового файла, вы можете рассчитать 1/5 от размера жесткого диска. Единственная проблема – время, необходимое для расчета.

Например, если я вычислял 1 терабайт цифр на другой терабайт цифр. Это около 2 триллионов цифр. Это можно сделать на жестком диске емкостью 8 терабайт. Тем не менее, у меня есть время, чтобы сделать расчет?

InfiX для R можно найти здесь. http://kevinhng86.iblog.website/2017/02/21/working-with-number-infinity-multiplication-optimised-the-code-r/

  • Все ли указатели данных одинакового размера на одной платформе для всех типов данных?
  • Что представляет собой тип, за которым следует _t (underscore-t)?
  • Совместимость шаблонов с несколькими типами Scala
  • Каков правильный тип индексов массивов в C?
  • Хранилище типов данных типа C ++
  • Создание экземпляра Generic с переменной, содержащей тип
  • Interesting Posts

    Принцип разделения сечений – программа для интерфейса

    Как программно установить SSLContext клиента JAX-WS?

    Как я могу безопасно просматривать ненадежный USB-накопитель?

    Как импортировать API javax.servlet в проект Eclipse?

    Force R не использовать экспоненциальную нотацию (например, e + 10)?

    Высокое среднее время отклика с жесткого диска

    Как создать соединение ssh Terminal ярлык на Mac OS X 10.6.8 (Snow Leopard)?

    Откройте новую вкладку в том же каталоге

    Chkdsk / r для моего pendrive – Недостаточно места на диске для восстановления потерянных данных после согласия на восстановление потерянных цепочек

    Программа, которая выводит экран каждые 15 минут и сохраняет его в файл

    Что такое продолжения Скалы и зачем их использовать?

    Windows 7 – добавить команду оболочки для файла .png

    Как написать trycatch в R

    добавление пользовательских вершин в графу форсирования

    Внешнее соединение с объединением в Excel 2010 с использованием Power Query

    Давайте будем гением компьютера.