Как загрузить файлы .rdata R в Python?

Я пытаюсь преобразовать одну часть кода R в Python. В этом процессе я сталкиваюсь с некоторыми проблемами.

У меня есть код R, как показано ниже. Здесь я сохраняю выходные данные R в формате .rdata.

nms <- names(mtcars)
save(nms,file="mtcars_nms.rdata")

Теперь мне нужно загрузить mtcars_nms.rdata в Python. Я импортировал модуль rpy2. Затем я попытался загрузить файл в рабочую область Python. Но не смог увидеть фактический результат.

Я использовал следующий код Python для импорта .rdata.

import pandas as pd
from rpy2.robjects import r,pandas2ri
pandas2ri.activate()

robj = r.load('mtcars_nms.rdata')
robj

Мой вывод python

R object with classes: ('character',) mapped to:
<StrVector - Python:0x000001A5B9E5A288 / R:0x000001A5B9E91678>
['mtcars_nms']

Теперь моя цель — извлечь информацию из mtcars_nms.

В R мы можем сделать это, используя

load("mtcars_nms.rdata");
get('mtcars_nms')

Теперь я хотел сделать то же самое в Python.


person RSK    schedule 07.08.2018    source источник


Ответы (3)


Существует новый пакет python pyreadr, который упрощает импорт файлов RData и Rds в python:

import pyreadr

result = pyreadr.read_r('mtcars_nms.rdata')

mtcars = result['mtcars_nms']

Это не зависит от наличия R или других внешних зависимостей. Это оболочка библиотеки C librdata, поэтому она работает очень быстро.

Вы можете очень легко установить его с помощью pip:

pip install pyreadr

Репозиторий находится здесь: https://github.com/ofajardo/pyreadr.

Отказ от ответственности: я разработчик.

person Otto Fajardo    schedule 27.12.2018
comment
Привет, когда я пытаюсь загрузить .rdata размером 700M, возникает такая ошибка: ValueError: Unable to allocate memory - person jmir; 07.01.2019
comment
привет, спасибо за попытку пакета! 700-мегабайтный файл RData огромен! У вас достаточно оперативной памяти? Учтите, что RData сильно сжат. Например, у меня есть файл RData размером 40 МБ, если я сохраню его в формате CSV, он займет 450 МБ, то есть в 11 раз больше. Если вы загружаете это в R, оно занимает 1,3 Гб! а загрузка в python занимает 1,8 Gb! то есть в 45 раз больше (панды очень голодны). Это означает, что если у вас есть файл RData размером 700 МБ, вам нужно как минимум 32 ГБ ОЗУ! и это было бы очень туго, потому что процессу временно требуется еще больше оперативной памяти. Я бы сказал, что вам понадобится как минимум 64 ГБ ОЗУ или около того. - person Otto Fajardo; 08.01.2019
comment
В библиотеке librdata C существует жестко закодированное ограничение на максимальное количество байтов, которое может иметь вектор во фрейме данных. Раньше он составлял 224 байта, то есть 222 целых числа или 221 двойное число, что относительно мало. Если вектор содержит больше байтов, чем это, возникает ошибка памяти. В новейшей версии он был увеличен до 232 байтов, что означает 230 целых чисел или 229 двойных значений, чего должно быть достаточно для практических целей. - person Otto Fajardo; 14.04.2019

Вместо использования формата .rdata я бы рекомендовал использовать feather, который позволяет эффективно обмениваться данными между R и Питон.

В R вы бы запустили что-то вроде этого:

library(feather)
write_feather(nms, "mtcars_nms.feather")

В Python, чтобы загрузить данные в кадр данных pandas, вы можете просто запустить:

import pandas as pd
nms = pd.read_feather("mtcars_nms.feather")
person mloning    schedule 07.08.2018

Функция R load вернет вектор R имен для объектов, которые были загружены (в GlobalEnv).

Вам придется делать в rpy2 почти то же, что и в R:

R:

get('mtcars_nms')

Python/RPY2

robjects.globalenv['mtcars_nms']
person lgautier    schedule 16.10.2018