rpy2 如何将 R 数据帧分配给 value/values

rpy2 How to assign R dataframe to value/values

如果我有一个 python 数据帧转换为 r 数据帧:

设置

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

rpy2.robjects.packages.Package as a <module 'base'>

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

一种实现您想要的方法是:

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

为什么 r_df['col1'] 之类的东西没有实现?因为 R 可能很奇特,rpy2 中的许多选择都更喜欢轻微的烦恼,而不是非常 hard-to-debug 问题的来源。这是因为不强制 R 数据框中的列名是唯一的,并且按名称获取项目将 return 第一个具有该名称的。例如:

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 listtuple 等...中并记录在 return 中第一个匹配索引。