2016-06-02 3 views
0

Кто-нибудь знает, как преобразовать str-вектор в 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, класс object - вектор str, что вызывает проблемы для моего дальнейшего анализа. , например.

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 в env. Я забыл скопировать его здесь

robjects.globalenv["x_ro"] = x_ro 

ответ

1

Относительно к вашей 1-й задаче, если переменная x_num в формате, который вы хотите в среде R, вы можете получить его вида в Python с использованием методы numpy.asarray() (как указано в documentation), поэтому изменения, которые вы могли бы сделали для этого массива в Python также действуют на основной R вектора:

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

Она также может быть сделано автоматически, если ввести эти строки кода:

from rpy2.robjects import numpy2ri 
numpy2ri.activate() 

Так что при вызове r("x_num") следует возвращать массив numpy, если это возможно.


Также в последнем фрагменте кода, вы уверены, что это «тот же самый» x_ro объект, так как вы не устанавливая его в R Environnement? Я думаю, вы должны сделать что-то вроде:

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

затем повторите попытку r('class(x_ro)') и посмотреть, если у вас есть правильный выход.

+0

спасибо! для второго вопроса я фактически добавляю x_ro в env, я забыл скопировать его здесь. Класс x_ro все еще является str-вектором. По первому вопросу, я хочу найти способ заставить str-вектор в float-векторе в python через rpy2 вместо использования 'r ('')'. но это не сработает. – user5025141

+0

Не нужно связывать объект rpy2 с символом в R 'globalenv', чтобы знать его класс в R. Просто выполните' tuple (x_ro.rclass) '. – lgautier

+0

@lgautier good catch (на самом деле я больше всего пытался подчеркнуть тот факт, что OP тестировал свой класс в R, из объекта rpy2, не имея первоначально (вопрос был отредактирован), явно связывает тезисы с двумя объектами, которые могут иметь было легко пропущено с помощью тех же имен переменных, например: – mgc

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

Установив, что мы можем строить R векторов поплавка из Python, мы можем смотреть на ли связывание его с символом в 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'] 
+0

показывает FloatVectors, как вы это делали, если вы просто распечатываете вектор. Но когда я делаю 'r ('class (FloatVector)), он показывает str vector. – user5025141

+0

То же (см. добавив вторую часть ответа). Без самодостаточного примера, демонстрирующего проблему, мне будет трудно убедить меня в том, что она есть. Не говоря, что нет никого, но говорю, что я не могу воспроизвести ее. – lgautier

Смежные вопросы