【问题标题】:How to load R's .rdata files into Python?如何将 R 的 .rdata 文件加载到 Python 中?
【发布时间】:2019-01-14 06:38:18
【问题描述】:

我正在尝试将一部分 R 代码转换为 Python。在这个过程中我遇到了一些问题。

我有一个如下所示的 R 代码。在这里,我将我的 R 输出保存为 .rdata 格式。

nms <- names(mtcars)
save(nms,file="mtcars_nms.rdata")

现在我必须将 mtcars_nms.rdata 加载到 Python 中。 我导入了 rpy2 模块。然后我尝试将文件加载到 python 工作区中。但无法看到实际输出。

我使用以下python代码导入.rdata

import pandas as pd
from rpy2.robjects import r,pandas2ri
pandas2ri.activate()

robj = r.load('mtcars_nms.rdata')
robj

我的python输出是

R object with classes: ('character',) mapped to:
<StrVector - Python:0x000001A5B9E5A288 / R:0x000001A5B9E91678>
['mtcars_nms']

现在我的目标是从 mtcars_nms 中提取信息。

在 R 中,我们可以使用

load("mtcars_nms.rdata");
get('mtcars_nms')

现在我想在 Python 中做同样的事情。

【问题讨论】:

    标签: python pandas rpy2


    【解决方案1】:

    有一个新的python包pyreadr可以很容易地将RData和Rds文件导入python:

    import pyreadr
    
    result = pyreadr.read_r('mtcars_nms.rdata')
    
    mtcars = result['mtcars_nms']
    

    它不依赖于安装 R 或其他外部依赖项。 它是 C 库 librdata 的包装器,因此速度非常快。

    你可以很容易地用 pip 安装它:

    pip install pyreadr
    

    repo 在这里:https://github.com/ofajardo/pyreadr

    免责声明:我是开发者。

    【讨论】:

    • 您好,当我尝试加载大小为 700M 的 .rdata 时,出现这样的错误:ValueError: Unable to allocate memory
    • 嗨,感谢您试用该软件包! 700 M RData 文件非常大!你有足够的内存吗?考虑到 RData 是高度压缩的。例如,我有一个 40 M 的 RData 文件,如果我将其保存为 CSV,则需要 450 M,所以要多 11 倍。如果将其加载到 R 中,它将占用 1.3 Gb!加载到 python 需要 1.8 Gb!意味着 45 倍以上(熊猫非常饿)。这意味着如果您有一个 700 Mb RData 文件,您至少需要 32 Gb 的 RAM!这将非常紧张,因为该过程暂时需要更多的RAM。我会说你至少需要 64 GB 左右的 RAM。
    • 在 librdata C 库中,数据帧中的向量可以拥有的最大字节数有硬编码限制。以前是 224 字节,意思是 222 个整数或 221 个双精度数,比较低。如果向量包含比这更多的字节,则会引发内存错误。在最新版本中已增加到 232 字节,即 230 个整数或 229 个双精度数,对于实际用途来说应该足够了。
    【解决方案2】:

    我建议使用feather,而不是使用.rdata 格式,这样可以在R 和Python 之间有效地共享数据。

    在 R 中,你会运行这样的东西:

    library(feather)
    write_feather(nms, "mtcars_nms.feather")
    

    在 Python 中,要将数据加载到 pandas 数据帧中,您可以简单地运行:

    import pandas as pd
    nms = pd.read_feather("mtcars_nms.feather")
    

    【讨论】:

      【解决方案3】:

      R 函数load 将返回已加载(到 GlobalEnv)对象的名称的 R 向量。

      你必须在 rpy2 中做你在 R 中所做的事情:

      R:

      get('mtcars_nms')
      

      Python/rpy2

      robjects.globalenv['mtcars_nms']
      

      【讨论】:

        猜你喜欢
        • 2014-02-12
        • 2020-08-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-06-16
        • 2013-05-20
        • 1970-01-01
        • 2018-02-19
        相关资源
        最近更新 更多