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

时间:2010-10-17 20:22:04

标签: database r rdata

我正在开发一个项目,我有很多分析师在R中创建统计模型。他们通常会为我提供模型对象(.Rdata文件),并为各种数据集自动执行它们。

我的问题是:

  • 我可以使用数据库并将这些.RData文件保存在那里吗?这样做的任何提示? (我目前将.Rdata文件存储到磁盘并使用数据库存储位置信息)

  • 我从其他分析师那里得到了很多R脚本,他们在创建模型之前已经对数据进行了一些预处理。有没有人有使用PMML的经验,无需人工干预即可重复此过程? PMML存储预处理步骤,将建模步骤作为标记标记存储,并在新数据集上重复相同步骤。

感谢您的建议和反馈。

-Harsh

4 个答案:

答案 0 :(得分:6)

是的,这可以使用例如与RMySQLDBI包链接到R的MySQL,或通过RODBCRJDBC包。我不是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包。也许那个人会把你送到某个地方?

答案 1 :(得分:2)

R可以序列化和反序列化任何对象,这就是我的digest包通过在序列化对象上运行哈希函数来创建所谓的“哈希摘要”的方式。

因此,一旦您拥有序列化对象(可以序列化为character),请将其存储起来。任何关系数据库都支持这一点,NoSQL键/值存储也是如此 - 对于任一后端,您甚至可以使用'哈希摘要'作为键或其他一些元信息。

其他替代方法例如RProtoBuf,它也可以非常有效地序列化和反序列化(但您必须先编写.proto文件)。

答案 2 :(得分:2)

请注意.RData文件可以包含许多R对象,因此您需要决定如何处理它。如果附加.RData文件,则可以使用带有pos参数的ls()获取其中的对象:

> 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)的表中。

答案 3 :(得分:1)

正如其他人所说,是的,您可以将模型的输出存储为数据库中的文本。我不相信这对你来说非常有用。

如果您希望以后能够重新创建这些模型,则需要存储创建模型的输入数据集和代码,而不是输出。

当然,您也可以存储模型输出,在这种情况下,您需要考虑数据库中的格式。如果您希望能够找到特定的模型结果并对其进行过滤或排序,那么如果使用某种结构(以及一些元数据)将它们添加到数据库中会更容易。

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