rpy2:如何将str矢量转换为数字矢量

时间:2016-06-02 13:36:53

标签: python r rpy2

任何人都知道如何将rpy2中的str矢量转换为数字矢量?

r('x_num = as.numeric(x)')

有效,但x_num不在python环境中。我无法从python中调用它。

我试过了:

x_num = base.as_numeric(x)
r('class(x_num)')

显示:

'<StrVector - Python:0x7fe602a54d88 / R:0xa06bb28>
[str]'

我之所以这样做是因为,当我将一个numpy数组传递给robjects.FloatVector时,该对象的类是str vector,这会导致我的进一步分析出现问题。 e.g。

x = pd.read_csv('x.csv', index_col=0).values.flatten()
x_ro = robjects.FloatVector(x)
r('class(x_ro)')
'<StrVector - Python:0x7fe605062098 / R:0xa16c158>
[str]'

非常感谢!

编辑: 我已经在环境中添加了x_ro。我忘了把它复制到这里

robjects.globalenv["x_ro"] = x_ro

2 个答案:

答案 0 :(得分:1)

关于第一个问题,如果x_num变量在R环境中是您想要的格式,您可以使用numpy.asarray()方法在python中获取其视图 (如documentation中所述),因此您在python中对此数组所做的更改也将对基础R向量起作用:

my_view = numpy.asarray(r("x_num"))

如果输入以下代码行,也可以自动完成:

from rpy2.robjects import numpy2ri
numpy2ri.activate()

因此,如果可能,调用r("x_num")应该返回一个numpy数组。

同样在您的最后一段代码中,您确定这是“相同的”x_ro对象,因为您没有在R环境中设置它吗? 我猜你应该这样做:

x_ro = robjects.FloatVector(x)
robjects.globalenv["x_ro"] = x_ro

然后再试一次r('class(x_ro)'),看看你是否有正确的输出。

答案 1 :(得分:1)

通过完整的工作示例更容易识别问题。没有它,我很想说它按预期工作。

In [1]: import rpy2.robjects as ro

In [2]: ro.vectors.FloatVector((1,2,3,4,5))
Out[2]: 
<FloatVector - Python:0x7f3541c68788 / R:0x3541468>
[1.000000, 2.000000, 3.000000, 4.000000, 5.000000]

In [3]: ro.vectors.FloatVector(('1','2','3','4','5'))
Out[3]: 
<FloatVector - Python:0x7f353bff7d88 / R:0x3541398>
[1.000000, 2.000000, 3.000000, 4.000000, 5.000000]

In [4]: ro.vectors.FloatVector(('1','2','3','a','5'))
---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
<ipython-input-4-263bdc61f184> in <module>()
----> 1 ro.vectors.FloatVector(('1','2','3','a','5'))

/usr/local/lib/python3.5/dist-packages/rpy2/robjects/vectors.py in __init__(self, obj)
    454 
    455     def __init__(self, obj):
--> 456         obj = FloatSexpVector(obj)
    457         super(FloatVector, self).__init__(obj)
    458 

ValueError: Error while trying to convert element 3 to a double.

In [5]: ro.vectors.FloatVector(ro.vectors.StrVector(('1','2','3','a','5')))
---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
<ipython-input-6-26578834d7ec> in <module>()
----> 1 ro.vectors.FloatVector(ro.vectors.StrVector(('1','2','3','a','5')))

/usr/local/lib/python3.5/dist-packages/rpy2/robjects/vectors.py in __init__(self, obj)
    454 
    455     def __init__(self, obj):
--> 456         obj = FloatSexpVector(obj)
    457         super(FloatVector, self).__init__(obj)
    458 

ValueError: Invalid SEXP type '16' (should be 14).

确定我们能够从Python构建浮点数的R向量,我们可以看看它是否将它绑定到R中的符号并从R访问该对象会产生任何差异。它没有:

In [1]: import rpy2.robjects as ro

In [2]: v = ro.vectors.FloatVector((1,2,3,4,5))

In [3]: ro.globalenv['v'] = v

In [4]: ro.r("print(v)")
[1]
 1
 2
 3
 4
 5


Out[4]: 
<FloatVector - Python:0x7fb4791e5f08 / R:0x2f7eed0>
[1.000000, 2.000000, 3.000000, 4.000000, 5.000000]

In [5]: ro.r("class(v)")
Out[5]: 
<StrVector - Python:0x7fb4791e5548 / R:0x2d02658>
['numeric']