将.RData文件序列化到数据库中

8
我正在从事一个项目,其中有许多分析师在R中创建统计模型。他们通常会向我提供模型对象(.Rdata文件),我会将其自动化执行以适应各种数据集。
我的问题是:
- 我能否使用数据库并保存这些.RData文件?有关此操作的任何提示?(我目前将.RData文件存储到磁盘上,并使用数据库存储位置信息) - 我从其他分析师那里得到了很多R脚本,他们在创建模型之前进行了一些数据预处理。是否有人使用PMML来使此过程可重复而无需手动干预?PMML将预处理步骤、建模步骤存储为标记,可以在新数据集上重复相同的操作。
感谢您的建议和反馈。
-Harsh
4个回答

6
是的,使用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)

现在您可以将对象存储或检索到数据库中。实际上,它只是一个ASCII(或二进制)代码向量。 ascii = F给出了二进制表示。检索后,您可以使用:

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

Coefficients:
(Intercept)            x  
      4.033        4.992  

编辑:关于PMML,CRAN上有一个pmml包。也许那个可以帮到你?


即使不支持 blob,您仍然可以将数据序列化/反序列化为 ASCII(就像您在示例中所做的那样),然后存储 ASCII 字符串。 - Dirk Eddelbuettel
1
请注意,ascii序列化对象的大小为16k字节(length(obj)),二进制版本的大小为11k字节,但如果您保存(“tt”,file =“tt.RData”),则只会得到一个大小为5k的文件。 - Spacedman
非常感谢。我正在寻找类似的东西。 - harshsinghal

2
注意,.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
R可以序列化和反序列化任何对象,这就是我的digest包通过对序列化对象运行哈希函数来创建所谓的“哈希摘要”的方式。
因此,一旦您拥有了序列化对象(可以序列化为字符),请将其存储。任何关系型数据库都支持此操作,NoSQL键/值存储也支持此操作——对于任何一个后端,您甚至可以使用“哈希摘要”作为键或其他元信息。
其他选择包括RProtoBuf,它也可以非常高效地进行序列化和反序列化(但您首先需要编写.proto文件)。

NoSQL的想法似乎很吸引人。 R中的新Tokyo Cabinet包可能会对此有所帮助。 - harshsinghal

1

正如其他人所提到的,是的,您可以将模型输出作为文本存储在数据库中。不过我并不认为这对您有多大用处。

如果您想要在以后重新创建这些模型,那么您需要存储创建模型的输入数据集和代码,而不是输出结果。

当然,您也可以将模型输出结果存储下来,这种情况下您需要考虑其在数据库中的格式。如果您想要查找特定的模型结果并进行筛选或排序,那么如果您将其添加到具有一些结构(以及一些元数据)的数据库中会更加容易。

例如,您可能希望检索所有存在显著性别反应的模型。在这种情况下,您需要将该信息作为单独的字段添加到数据库中,而不是在 ascii 的块中搜索。添加其他信息,如模型创建者和创建日期,也将有助于以后的使用。


你似乎触及到了我问题的各个方面。我正在尝试创建一种方法来“标记”glm模型对象中的自变量,如果某些变量是从源数据列(及其转换)派生而来的。目前,我保存模型和用于创建它的R脚本,但我想创建一个更通用的结构,以重新跟踪从数据到模型对象的路径。 - harshsinghal

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接