我能用rpy2将pandas数据框保存为.Rdata文件吗?

15 投票
3 回答
7682 浏览
提问于 2025-04-17 17:08

我之前从来没用过rpy2,但我想知道我能不能用它把一个Python对象(比如一个pandas的数据框)保存成R能读的文件。我在这两个环境之间移动对象时遇到了麻烦,主要是因为我用的是Windows系统,而数据源是一个Excel文件。没错,就是那种包含文本的单元格,里面有引号、换行符,还有一些CSV处理不了的东西。

我通常依赖XLConnectJars,但现在好像坏掉了。

Installing package(s) into ‘C:/Program Files/R/library’
(as ‘lib’ is unspecified)
trying URL 'http://cran.csiro.au/bin/windows/contrib/2.15/XLConnectJars_0.2-4.zip'
Content type 'application/zip' length 16538311 bytes (15.8 Mb)
opened URL
downloaded 15.3 Mb

Warning in install.packages :
  downloaded length 16011264 != reported length 16538311

pandas可以正确读取这些数据,但我需要在R中使用这些信息。

3 个回答

2

我使用的是最新版本的 rpy2,也就是3.3.2版本,发现之前的那些解决办法都不管用了。现在的转换方式似乎有点不同了。

import pandas
p_df = pandas.DataFrame(data={'col1': [1, 2], 'col2': [3, 4]})

下面的代码可以把上面的pandas数据框转换成R的数据框,并将这个R的数据框保存为一个R的 .rds 文件。

from rpy2 import robjects
from rpy2.robjects import pandas2ri
from rpy2.robjects.conversion import localconverter

# Convert pandas dataframe to R dataframe
with localconverter(robjects.default_converter + pandas2ri.converter):
    r_df = robjects.conversion.py2rpy(p_df)

# Save R dataframe as .rds file
r_file = "file.rds"
robjects.r.assign("my_df_tosave", r_df)
robjects.r(f"saveRDS(my_df_tosave, file='{r_file}')")

接下来的代码可以加载这个 .rds 文件,并把它转换回pandas数据框。

# Load as R dataframe from .rds file
r_file = "file.rds"
robjects.r(f"df_to_load <- readRDS('{r_file}')") 
r_df = robjects.r["df_to_load"]

# Convert R dataframe to pandas dataframe
with localconverter(robjects.default_converter + pandas2ri.converter):
    p_df = robjects.conversion.rpy2py(r_df)
8

下面是如何使用 rpy2 来写入和读取 .RData 文件的方法(因为之前的解决方案已经过时,并且没有展示如何保存到 .RData 文件):

import rpy2
from rpy2 import robjects
from rpy2.robjects import pandas2ri
pandas2ri.activate()

# read .RData file as a pandas dataframe
def load_rdata_file(filename):
    r_data = robjects.r['get'](robjects.r['load'](filename))
    df = pandas2ri.ri2py(r_data)
    return df

# write pandas dataframe to an .RData file
def save_rdata_file(df, filename):
    r_data = pandas2ri.py2ri(df)
    robjects.r.assign("my_df", r_data)
    robjects.r("save(my_df, file='{}')".format(filename))
7

你可以使用 rpy2 来实现这个功能。一旦你把数据放到 pandas 里,就需要把它传输到 R 里。这个链接 提供了一个实验性的接口,可以让 Python 的 Pandas 和 R 的数据框进行连接。下面是从网站上复制的一个代码示例:

from pandas import DataFrame
import pandas.rpy.common as com

df = DataFrame({'A': [1, 2, 3], 'B': [4, 5, 6], 'C':[7,8,9]},
                index=["one", "two", "three"])
r_dataframe = com.convert_to_r_dataframe(df)

print type(r_dataframe)
 <class 'rpy2.robjects.vectors.DataFrame'>

print r_dataframe
      A B C
one   1 4 7
two   2 5 8
three 3 6 9

撰写回答