【问题标题】:Serializing .RData file to database将 .RData 文件序列化到数据库
【发布时间】:2011-04-26 16:30:59
【问题描述】:

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

我的问题是:

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

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

感谢您的建议和反馈。

-苛刻

【问题讨论】:

    标签: database r rdata


    【解决方案1】:

    正如其他人所提到的,是的,您可以将模型的输出作为文本存储在数据库中。不过,我不相信这会对你很有用。

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

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

    例如,您可能想要检索所有具有显着性别反应的模型。在这种情况下,您需要将该信息作为单独的字段添加到数据库中,而不必搜索 ascii 块。添加其他信息(例如模型创建者和创建日期)也将对您以后有所帮助。

    【讨论】:

    • 您似乎已经触及了我问题的各个方面。我正在尝试创建一种方法来“标记”glm 模型对象中的自变量,以及是否从源数据列(及其转换)派生的某些变量。目前,我保存了模型和创建它的 R 脚本,但我想创建一个更通用的结构来重新跟踪从数据到模型对象的路径。
    【解决方案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 的元素喷射到您的数据库中,可能是在名称(某种字符)和值(我猜是序列化数据,BLOB 或 varchar)的表中。

    【讨论】:

      【解决方案3】:

      是的,这可以使用例如通过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 包。也许那个人会把你带到某个地方?

      【讨论】:

      • 即使不支持 blob,您也可以对 ascii 进行序列化/反序列化(就像您在示例中所做的那样),然后存储 ascii 字符串。
      • 注意,ascii序列化的obj是16k字节大(length(obj)),二进制版本是11k字节大,但是如果你保存("tt",file="tt.RData")你得到的东西只有 5k 大。
      • 非常感谢。我正在寻找类似的东西。
      【解决方案4】:

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

      所以一旦你有了序列化的对象(可以序列化为character),就存储它。任何关系数据库都将支持这一点,NoSQL 键/值存储也将支持这一点——对于任一后端,您甚至可以使用“哈希摘要”作为键或其他一些元信息。

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

      【讨论】:

      • NoSQL 的想法似乎很有吸引力。 R 中的新东京内阁包可以在这里提供帮助。
      猜你喜欢
      • 2018-03-28
      • 2013-11-26
      • 2012-02-09
      • 1970-01-01
      • 2018-02-19
      • 2013-02-12
      • 2020-08-06
      • 2014-08-28
      • 2012-11-11
      相关资源
      最近更新 更多