pandas.rpy.common.load_data() 的使用/文档?

3 投票
2 回答
5045 浏览
提问于 2025-04-18 09:47

我正在尝试把一些 <class 'rpy2.robjects.vectors.Matrix'> 类型的变量转换成 Pandas 数据框。

网上有很多关于如何做到这一点的复制粘贴的说明,通常都会给出一个简单的例子:

pandas.rpy.common.load_data("infert")

但没有说明 "infert" 是从哪里来的。我找不到这个函数的任何文档(为什么没有呢?),但显然我不能使用它:

summary= r.summary(linear_model)
filtered_summary=summary.rx2("tTable")
print com.load_data("filtered_summary")

这让我得到了:

---------------------------------------------------------------------------
LookupError                               Traceback (most recent call last)
<ipython-input-68-a087eddd5220> in <module>()
      8 #print test1_sum.names
      9 print type(r_res)
---> 10 print com.load_data("filtered_summary")
     11 #print pd.DataFrame(test1_sum.rx2("tTable"))
     12 

/usr/lib64/python2.7/site-packages/pandas/rpy/common.pyc in load_data(name, package, convert)
     29     r.data(name)
     30 
---> 31     robj = r[name]
     32 
     33     if convert:

/usr/lib64/python2.7/site-packages/rpy2/robjects/__init__.pyc in __getitem__(self, item)
    226 
    227     def __getitem__(self, item):
--> 228         res = _globalenv.get(item)
    229         res = conversion.ri2ro(res)
    230         res.__rname__ = item

LookupError: 'filtered_summary' not found

而:

summary= r.summary(linear_model)
print com.load_data("summary")

则让我得到了:

---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-69-b51722281aa4> in <module>()
      8 #print test1_sum.names
      9 print type(r_res)
---> 10 print com.load_data("summary")
     11 #print pd.DataFrame(test1_sum.rx2("tTable"))
     12 

/usr/lib64/python2.7/site-packages/pandas/rpy/common.pyc in load_data(name, package, convert)
     32 
     33     if convert:
---> 34         return convert_robj(robj)
     35     else:
     36         return robj

/usr/lib64/python2.7/site-packages/pandas/rpy/common.pyc in convert_robj(obj, use_pandas)
    222             return converter(obj)
    223 
--> 224     raise TypeError('Do not know what to do with %s object' % type(obj))
    225 
    226 

TypeError: Do not know what to do with <class 'rpy2.robjects.functions.SignatureTranslatedFunction'> object

所以:

  • 我该如何正确使用 load_data
  • 我怎样才能把我的 R 矩阵最好地转换成 Pandas 数据框?

2 个回答

4

我不太确定这是不是使用load_data的“正确”方式,但我发现如果你的R数据框(比如叫myRData)存储在默认的工作空间(.RData文件)里,并且在默认的工作目录下,那么你可以用load_data来加载myRData,方法是:

import rpy2.robjects as robjects
import pandas.rpy.common as com
print robjects.r.load(".RData")
myRData = com.load_data('myRData')

你还可以使用robjects.r.XXX来运行其他R函数,比如robjects.r.getwd()或者robjects.r.setwd("path_to_new_working_directory"),这样可以帮助你切换到新的工作目录。

2

load_data 函数可以用来把 R 语言中的数据集加载到一个数据框(dataframe)里,这些数据集来自 R 的 datasets 包。简单来说,它是 R 语言中 data() 函数的一个封装。

例如:

from pandas.rpy.common import load_data
iris = load_data('iris')

这段代码会加载著名的鸢尾花(iris)数据集。文档中对此有简要提及:http://pandas.pydata.org/pandas-docs/stable/r_interface.html#transferring-r-data-sets-into-python

如果你想把一个 rpy2.robjects... 对象转换成 pandas 数据框,你可以这样做:

from rpy2.robjects import pandas2ri
pandas2ri.activate()

这样转换应该会自动完成。或者你也可以明确地这样做:pandas2ri.ri2pandas(rpy2_object)

撰写回答