我正在开发一个项目,我有很多分析师在R中创建统计模型。他们通常会为我提供模型对象(.Rdata文件),并为各种数据集自动执行它们。
我的问题是:
我可以使用数据库并将这些.RData文件保存在那里吗?这样做的任何提示? (我目前将.Rdata文件存储到磁盘并使用数据库存储位置信息)
我从其他分析师那里得到了很多R脚本,他们在创建模型之前已经对数据进行了一些预处理。有没有人有使用PMML的经验,无需人工干预即可重复此过程? PMML存储预处理步骤,将建模步骤作为标记标记存储,并在新数据集上重复相同步骤。
感谢您的建议和反馈。
-Harsh
答案 0 :(得分:6)
是的,这可以使用例如与RMySQL
和DBI
包链接到R的MySQL,或通过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
包。也许那个人会把你送到某个地方?
答案 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的块。添加模型创建者和创建日期等其他信息也会在以后帮助您。