使用rpy2从Python获取R对象的一部分

3
我可以使用R得到所需的输出,但我无法在Python的rpy2模块中重现。
在R中:
> wilcox.test(c(1,2,3), c(100,200,300), alternative = "less")$p.value

提供

[1] 0.05

在Python中:

import rpy2.robjects as robjects
rwilcox = robjects.r['wilcox.test']
x = robjects.IntVector([1,2,3,])
y = robjects.IntVector([100,200,300])
z = rwilcox(x,y, alternative = "less")
print z

提供:

Wilcoxon rank sum test  
data:  1:3 and c(100L, 200L, 300L)  
W = 0, p-value = 0.05  
alternative hypothesis: true location shift is less than 0 

并且:

z1 = z.rx('p.value')
print z1

提供:

$p.value  
[1] 0.05

仍在努力将0.05的最终值存储为变量,但这似乎更接近最终答案。

我无法弄清楚我的Python代码需要什么来将p.value存储在新变量中。

2个回答

3

z1 是包含一个元素的FloatVectorListVector

>>> z1
<ListVector - Python:0x4173368 / R:0x36fa648>
[FloatVector]
  p.value: <class 'rpy2.robjects.vectors.FloatVector'>
  <FloatVector - Python:0x4173290 / R:0x35e6b38>
[0.050000]

您可以使用z1[0][0]或者float(z1[0])来提取浮点数本身:

>>> z1[0][0]
0.05
>>> type(z1[0][0])
<type 'float'>
>>> float(z1[0])
0.05

通常情况下,如果您只提供要表示的对象的名称,那么在交互式会话中更容易弄清楚发生了什么。使用print x语句将事物通过str(x)进行转换,而交互式循环隐式使用的repr(x)表示形式更有帮助。如果您正在脚本中执行操作,请改用print repr(x)


非常感谢repr的建议,这是我不熟悉的东西。正如我在对muraveill的评论中所指出的那样,这个方法可以工作,但同样会导致“分段错误:11”的崩溃。 - ded

2

谢谢,实际上这是我一直在尝试的事情,但一直导致“分段错误:11”崩溃。不过尝试获取“方法”确实可以正常工作,所以我猜测这可能是我的计算机出了问题。 - ded
2
@ded:这很可能是R和rpy2之间编译库不兼容的问题。如果在升级R时没有重新安装rpy2(主要是在最近的OS X上,如果我依赖用户的报告),就会发生这种情况。如果段错误仍然存在,请在rpy2的bitbucket页面上提交一个错误报告(并提供触发它的代码)。 - lgautier

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接