Поддержка 64-битных целых чисел в перьях

Может ли пакет 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)

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


person wibeasley    schedule 18.10.2019    source источник


Ответы (1)


На самом деле это «сложно». Как вы, наверное, знаете, сам R имеет только два типа: 32-битное целое и 64-битное двойное.

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

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

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

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

person Dirk Eddelbuettel    schedule 19.10.2019
comment
Этот контекст помогает, спасибо. С другой стороны, установка стрелки потребовала дополнительной работы для установки зависимостей. Но после установки модификация кода была такой же простой, как замена feather::write_feather() на arrow::write_feather(). - person wibeasley; 19.10.2019
comment
Я не думаю, что data.table сработает, так как я торгую наборами данных с пользователем Python (которого я не указал в своем вопросе), но, возможно, я неправильно понимаю ваше последнее предложение. - person wibeasley; 19.10.2019
comment
Да. Когда у вас есть данные в R, вы можете использовать data.table для хранения. Это не поможет вам при первоначальном преобразовании из Python. Для этого reticulate может помочь. - person Dirk Eddelbuettel; 19.10.2019