【问题标题】:Call R package data using Python with rpy2使用带有 rpy2 的 Python 调用 R 包数据
【发布时间】:2020-10-03 07:49:04
【问题描述】:

我想在 Python 中使用来自 R 包 library(ISLR)Auto 数据。 我做了一些受Introduction to rpy2启发的测试如下:

from rpy2 import robjects
from rpy2.robjects.packages import importr, data
from rpy2.robjects import pandas2ri
pandas2ri.activate()

datasets = importr('datasets') # data(mtcars) in library(datasets)
mtcars = data(datasets).fetch('mtcars')['mtcars']

ISLR = importr('ISLR') # data(Auto) in library(ISLR)
Auto = data(ISLR).fetch('Auto')['Auto']

#r_df = mtcars # success!!!
r_df = Auto # fail???

df = pandas2ri.ri2py(robjects.DataFrame(r_df))
df.info()

那我就可以测试data(mtcars) in library(datasets)成功了,同时测试 data(Auto) in library(ISLR) 将错误显示为

Parameter 'categories' must be list-like

我该如何解决这个问题?

【问题讨论】:

    标签: r


    【解决方案1】:

    你使用的是什么版本的 rpy2?我正在使用带有 R-4.0.3(来自 conda-forge)和 Python-3.6.11(来自 conda-forge)的 Conda 环境中使用 pip 安装的 rpy2-3.3.6,并且我能够同时读取 mtcars 来自 datasets 以及 Auto 来自 ISLR。请检查我在下面得到的结果

    我认为您看到的错误可能是错误或配置/依赖项的副作用。您应该将您的 rpy2 版本升级到更新的 >= 3.3.0 并仔细检查依赖关系。

    请查看这篇文章,了解随着时间的推移,函数是如何随着 rpy2 Pandas - how to convert r dataframe back to pandas? 而变化的

    这是我的命令行的整个序列:

    Python 3.6.11 | conda-forge 打包| (默认,2020 年 8 月 5 日,20:09:42) [GCC 7.5.0] 在 Linux 上 输入“help”、“copyright”、“credits”或“license”了解更多信息。

    Importing relevant libraries
    
    >>> import rpy2.robjects as ro
    >>> import rpy2.robjects.packages as rpackages
    >>> from rpy2.robjects.vectors import StrVector
    >>> from rpy2.robjects.packages import importr, data
    
    Importing packages and reading in the data
    
    >>> datasets = importr('datasets')
    >>> mtcars = data(datasets).fetch('mtcars')['mtcars']
    
    >>> ISLR = importr('ISLR')
    >>> Auto = data(ISLR).fetch('Auto')['Auto']
    
    >>> r_df_mtcars = mtcars (using labels to clarify origin of data)
    >>> r_df_Auto = Auto
    
    Converting R Data frames into Pandas Data frames
    *Note* the function **conversion.rpy2py** New from rpy2 version 3.3.0
    
    >>> pd_df_mtcars = ro.conversion.rpy2py(r_df_mtcars)
    >>> pd_df_Auto = ro.conversion.rpy2py(r_df_Auto)
    
    Examine the data using the Pandas head() for both
    
    >>> pd_df_mtcars.head()
                        mpg  cyl   disp     hp  drat     wt   qsec   vs   am  gear  carb
    Mazda RX4          21.0  6.0  160.0  110.0  3.90  2.620  16.46  0.0  1.0   4.0   4.0
    Mazda RX4 Wag      21.0  6.0  160.0  110.0  3.90  2.875  17.02  0.0  1.0   4.0   4.0
    Datsun 710         22.8  4.0  108.0   93.0  3.85  2.320  18.61  1.0  1.0   4.0   1.0
    Hornet 4 Drive     21.4  6.0  258.0  110.0  3.08  3.215  19.44  1.0  0.0   3.0   1.0
    Hornet Sportabout  18.7  8.0  360.0  175.0  3.15  3.440  17.02  0.0  0.0   3.0   2.0
    >>> pd_df_Auto.head()
        mpg  cylinders  displacement  horsepower  weight  acceleration  year  origin                       name
    1  18.0        8.0         307.0       130.0  3504.0          12.0  70.0     1.0  chevrolet chevelle malibu
    2  15.0        8.0         350.0       165.0  3693.0          11.5  70.0     1.0          buick skylark 320
    3  18.0        8.0         318.0       150.0  3436.0          11.0  70.0     1.0         plymouth satellite
    4  16.0        8.0         304.0       150.0  3433.0          12.0  70.0     1.0              amc rebel sst
    5  17.0        8.0         302.0       140.0  3449.0          10.5  70.0     1.0                ford torino
    
    To convert Pandas df to R df you can use:
    
    >>> r_mtcars_df = ro.conversion.py2rpy(pd_df_mtcars)
    >>> r_Auto_df = ro.conversion.py2rpy(pd_df_mtcars)
    

    【讨论】:

    • 是的,你说的很对!在我更新 ryp2 模块并遵循您的代码后,它就可以工作了!感谢您的热心帮助! @sreedta
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-05-18
    • 2017-07-24
    • 2014-08-24
    • 1970-01-01
    • 2017-12-06
    • 1970-01-01
    相关资源
    最近更新 更多