加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Python > 正文

在python中使用低级别rpy2创建R data.frame

发布时间:2020-12-20 13:29:08 所属栏目:Python 来源:网络整理
导读:我正在使用rpy2包为 python带来一些R功能. 我在R中使用的函数需要一个data.frame对象,通过使用rlike.TaggedList然后使用robjects.DataFrame我可以使这个工作. 但是我遇到了性能问题,当与具有完全相同数据的完全相同的R函数进行比较时,这使我尝试使用这里提到
我正在使用rpy2包为 python带来一些R功能.
我在R中使用的函数需要一个data.frame对象,通过使用rlike.TaggedList然后使用robjects.DataFrame我可以使这个工作.

但是我遇到了性能问题,当与具有完全相同数据的完全相同的R函数进行比较时,这使我尝试使用这里提到的rpy2低级接口 – http://rpy.sourceforge.net/rpy2/doc-2.3/html/performances.html

到目前为止,我尝试过:

>将TaggedList与FloatSexpVector对象(而不是numpy数组)和DataFrame对象一起使用.
>使用如下字典转储TaggedList和DataFrame类:

d = dict((var_name,var_sexp_vector) for ...)
dataframe = robjects.r('data.frame')(**d)

两者都没有给我任何明显的加速.

我注意到DataFrame对象可以在它们的构造函数中得到一个rinterface.SexpVector,所以我想到创建一个这样的命名向量,但我不知道如何输入名称(在RI中知道它的名字(vec) = c(‘a’,’b’……)).

我怎么做?还有另外一种方法吗?
有没有一种简单的方法来描述rpy本身,所以我可以知道瓶颈在哪里?

编辑:

以下代码似乎在较新的rpy(2.2.3)上工作得很好(x4更快)

data = ro.r('list')([ri.FloatSexpVector(x) for x in vectors])[0]
data.names = ri.StrSexpVector(vector_names)

但是它没有版本2.0.8(最后一个由Windows支持),因为R似乎无法使用名称:“eval中的错误(expr,envir,enclos):找不到对象’y’”

想法?

编辑#2:
有人为windows(python 2.7)构建rpy2.3二进制文件做得很好,上面提到的工作很棒(我的代码快了几乎x6)

链接:https://bitbucket.org/breisfeld/rpy2_w32_fix/issue/1/binary-installer-for-win32

解决方法

Python可以比R快几倍(甚至是字节编译的R),并且我设法在R数据结构上执行操作,其中rpy2比R更快.共享相关的R和rpy2代码将有助于提出更具体的建议(如果需要,还可以改进rpy2).

在此期间,SexpVector可能不是你想要的;它只不过是所有R向量的抽象类(见class diagram for rpy2.rinterface). ListSexpVector可能更合适:

import rpy2.rinterface as ri
ri.initr()
l = ri.ListSexpVector([ri.IntSexpVector((1,2,3)),ri.StrSexpVector(("a","b","c")),])

一个重要的细节是R列表是递归数据结构,R通过让运算符“[[”(除了“[”)来避免捕获22类型的情况. Python没有那个,我还没有(但是?)实现了“[[”作为低级别的方法.

例如,可以使用模块stdlib模块cProfile完成Python中的分析.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读