Поддержка 64-разрядных целых чисел в перо - PullRequest
0 голосов
/ 19 октября 2019

Может ли пакет feather в R поддерживать 64-битные целые числа?

Когда набор данных передается в feather::write_feather(), столбец преобразуется в 64-разрядное число с плавающей запятой и теряет точность. Я хотел бы избежать преобразования его в символ.

Вот упрощенный пример. В реальном проекте таблица базы данных (полученная с помощью пакета odbc) имеет столбцы, которые являются допустимыми 64-разрядными целыми числами (как указано в пакете bit64 ).

requireNamespace("bit64")

path <- base::tempfile(fileext = ".feather")

ds <-
  tibble::tibble(
    patient_id   = bit64::as.integer64(1:6)
  )
ds

# # A tibble: 6 x 1
#   patient_id
#   <int64>   
# 1 1         
# 2 2         
# 3 3         
# 4 4         
# 5 5         
# 6 6 

feather::write_feather(x = ds, path = path)

ds_read <- feather::read_feather(path)
# # A tibble: 6 x 1
#    patient_id
#         <dbl>
# 1 Inf.Nae-324
# 2 Inf.Nae-324
# 3   1.50e-323
# 4   2.00e-323
# 5   2.50e-323
# 6   3.00e-323


as.integer(ds_read$patient_id)
# Returns: [1] 0 0 0 0 0 0

unlink(path_out)

Примечание: я не хочу хранить их как числа с плавающей запятой, как предложено здесь .

1 Ответ

1 голос
/ 19 октября 2019

Это на самом деле "сложно". Как вы, вероятно, знаете, сам R имеет только два типа: 32-разрядное целое и 64-разрядное двойное.

Таким образом, чтобы представить 64-разрядные целые числа, Дженс проделал определенную работу в своем пакете bit64, чтобы использовать двойноев качестве «носителя» для 64-разрядной полезной нагрузки и переопределения всех функциональных возможностей средства доступа, чтобы рассматривать его как 64-разрядное (подписанное) целое число. Это работает.

Несколько пакетов поддерживают его изначально, например data.table. Я воспользовался этим, когда создал nanotime - который использует 64-битные целые числа в наносекундах с той эпохи. Это также работает: мы никогда не конвертируем в удвоение и получаем точное представление целых чисел.

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

Короче говоря: ваш вопрос - скорее запрос функции для feather. А поскольку те, кто сейчас занимается, сосредоточены на arrow, который, похоже, поддерживает 64-битное целое число, вам, скорее всего, просто предложат перейти на arrow. Или вы можете использовать data.table.

...