Получение части объекта R из python с помощью rpy2


Я могу получить вывод, который мне нужен, используя R, но я не могу воспроизвести в модуле rpy2 python.

В 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.в новой переменной.

2 2

2 ответа:

Просто используя list() ?

pval = z.rx2('p-value')
print list(pval) # [0.05]

Rpy2 также хорошо работает с numpy:

import numpy
pval = numpy.array(pval)
print pval       # array([ 0.05])

Http://rpy.sourceforge.net/rpy2/doc-2.3/html/numpy.html#from-rpy2-to-numpy

z1 является ListVector содержащим один FloatVector с одним элементом:

>>> 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).