在python中使用低级别rpy2创建R data.frame
我正在使用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对象一起使用. d = dict((var_name,var_sexp_vector) for ...) dataframe = robjects.r('data.frame')(**d) 两者都没有给我任何明显的加速. 我注意到DataFrame对象可以在它们的构造函数中得到一个rinterface.SexpVector,所以我想到创建一个这样的命名向量,但我不知道如何输入名称(在RI中知道它的名字(vec) = c(‘a’,’b’……)). 我怎么做?还有另外一种方法吗? 编辑: 以下代码似乎在较新的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: 链接: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中的分析. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |