Получение части объекта 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 ответа:
Просто используя 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)
.