rpy2 Как назначить фрейм данных R значению / значениям - PullRequest
0 голосов
/ 05 августа 2020

Если у меня есть python dataframe, преобразованный в r dataframe с:

Setup

import rpy2.robjects as ro
from rpy2.robjects.vectors import ListVector, DataFrame
from rpy2.robjects import numpy2ri, pandas2ri
from rpy2.robjects.conversion import localconverter
from rpy2.robjects.packages import importr
base = importr("base")
### do not activate rpy2.robjects.numpy2ri.activate() or pandas2ri

base выглядит как

base

rpy2.robjects.packages.Package as a

with localconverter(ro.default_converter + pandas2ri.converter):
   r_df = ro.conversion.py2rpy(df)

Как мне обновить столбец до нового типа данных? В python я бы сделал:

r_['col1'] = 'test'

Или с r я бы подумал, что это будет так:

r_df.rx2('col1') = base.as_Date(r_df.rx2('col1'), '%Y-%m-%d')

Версии:

pandas == 1.0. 1

rpy2 ~ = 3.3.5

1 Ответ

1 голос
/ 10 августа 2020

Один из способов достичь желаемого:

r_df[r_df.colnames.index('col1')] = base.as_Date(r_df.rx2('col1'), '%Y-%m-%d')

Почему что-то вроде r_df['col1'] не реализовано? Потому что R может быть своеобразным, и многие варианты в rpy2 предпочитают легкое раздражение источнику очень трудных для отладки проблем. Здесь это связано с тем, что имена столбцов в кадре данных R не обязательно должны быть уникальными, и получение элемента по имени вернет первый с этим именем. Например:

import rpy2.robjects as ro
dataf = ro.r('data.frame(x=1:3, x=4:6, check.names=FALSE)')

print(dataf)
#   x x
# 1 1 4
# 2 2 5
# 3 3 6

dataf.rx2('x')                                                          
# R object with classes: ('RTYPES.INTSXP',) mapped to:
# [1, 2, 3]

Метод Python index присутствует в Python list, tuple, et c ... и задокументирован для возврата первого соответствующего индекса. .

...