Сериализация .RData файла в базу данных - PullRequest
8 голосов
/ 18 октября 2010

Я работаю над проектом, в котором у меня много аналитиков, создающих статистические модели в R. Они обычно предоставляют мне объекты модели (файлы .Rdata), и я автоматизирую их выполнение для различных наборов данных.

Моя проблема:

  • Могу ли я использовать базу данных и сохранить эти файлы .RData там? Любые намеки на это? (В настоящее время я храню файлы .Rdata на диске и использую базу данных для хранения информации о местоположении)

  • Я получаю множество R-скриптов от других аналитиков, которые выполнили некоторую предварительную обработку данных перед созданием моделей. У кого-нибудь есть опыт использования PMML, чтобы сделать этот процесс повторяемым без ручного вмешательства? PMML сохраняет этапы предварительной обработки, этапы моделирования в виде тегов разметки, и будет повторять то же самое для нового набора данных.

Спасибо за предложения и отзывы.

-Harsh

Ответы [ 4 ]

6 голосов
/ 18 октября 2010

Да, это возможно, например, используя MySQL, связанный с R с помощью пакета RMySQL и DBI, или через пакет RODBC или RJDBC.Я не уверен на 100%, поддерживают ли они все BLOB-объекты, но в худшем случае вы можете использовать представление ascii и поместить их в текстовое поле.

Хитрость заключается в использовании функции serialize()

> x <- rnorm(100)
> y <- 5*x+4+rnorm(100,0,0.3)
> tt <- lm(y~x)
> obj <- serialize(tt,NULL,ascii=T)

Теперь вы можете сохранять или получать obj в базе данных.На самом деле это не более чем вектор ascii (или двоичных) кодов.ascii = F дает вам двоичное представление.Получив его, вы используете:

> unserialize(obj)
Call:
lm(formula = y ~ x)

Coefficients:
(Intercept)            x  
      4.033        4.992  

Редактировать: в отношении pmml на CRAN есть пакет pmml.Может быть, кто-то тебя куда-то доставит?

2 голосов
/ 18 октября 2010

Обратите внимание, что файл .RData может содержать много объектов R, поэтому вам нужно решить, как с этим справиться. Если вы прикрепите файл .RData, вы можете получить в нем объекты с помощью ls () с аргументом pos:

> attach("three.RData")
> ls(pos=2)
[1] "x" "y" "z"

затем вы можете зациклить их, получить () их по имени из позиции и сериализовать их в список (p - мой индекс списка)

> s=list()
> p=1
>  for(obn in obnames){
+ s[[p]] = serialize(get(obn,pos=2),NULL,ascii=TRUE)
+ p=p+1
+ }

Теперь вам нужно добавить элементы s в вашу БД, вероятно, в таблице Name (какой-то тип char) и Value (сериализованные данные, я думаю, BLOB или varchar).

2 голосов
/ 18 октября 2010

R может сериализовать и десериализовать любой объект, поэтому мой пакет digest создает так называемые «хэш-дайджесты», выполняя хеш-функцию над сериализованным объектом.

Поэтому, когда у вас есть сериализованный объект (который можно сериализовать до character), сохраните его. Любая реляционная база данных будет поддерживать это, равно как и хранилища ключей / значений NoSQL - и для любого бэкэнда вы даже можете использовать «хэш-дайджест» в качестве ключа или некоторую другую мета-информацию.

Другими альтернативами являются, например, RProtoBuf , который также может очень эффективно сериализовать и десериализовать (но сначала вам нужно будет записать файлы .proto).

1 голос
/ 18 октября 2010

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

Если вы хотите иметь возможность воссоздать эти модели позднее, вам нужно сохранить входной набор данных и код, который создал модели, а не выходные данные.

Конечно, вы также можете сохранить выходные данные модели, в этом случае вам нужно подумать о ее формате в базе данных. Если вы хотите иметь возможность найти конкретные результаты модели и отфильтровать или упорядочить их, то будет гораздо проще, если вы добавите их в базу данных с некоторой структурой (и некоторыми метаданными).

Например, вы можете получить все модели, в которых был значительный гендерный отклик. В этом случае вам нужно добавить эту информацию в виде отдельного поля в базе данных, а не искать по фрагментам ascii. Добавление другой информации, такой как создатель модели и дата создания, также поможет вам позже.

...