任何人都知道如何将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
答案 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']