我在Python中有一个Pandas DataFrame
,我使用data.frame
转换为R rpy2
。一些示例设置代码如下:
import pandas as pd
import rpy2.robjects as robjects
from rpy2.robjects import r, pandas2ri
df = pd.DataFrame({
'col_1': ['a', 'b', 'c'],
'col_2': [1, 2, 3],
'col_3': [2.3, 5.4, 3.8]
})
pandas2ri.activate()
r_df = pandas2ri.py2ri(df)
col_2
充满了整数值,正如预期的那样,在转换过程中,它会转换为R {s} int
原子模式。我可以使用以下方法检查类(我理解为可以应用于底层对象的哪些函数):
r.sapply(r_df, r['class'])
但是,这个变量实际上是名义上的(无序的分类)。因此,我需要将此列转换为一个因子。
在R中,我可以通过使用类似的东西重新分配来轻松完成此任务:
r_df$col2 <- as.factor(r_df$col2)
但是,我不确定使用rpy2
的语法是否正确。我可以使用rx2
访问器方法访问该列,并使用FactorVector
将列强制转换为一个因子。
col2 = robjects.vectors.FactorVector(r_df.rx2('col_2'))
但是,我似乎无法将其重新分配回原始数据框。将此重新分配回原始数据框的最佳方法是什么?有没有更好的方法来进行这种转换?感谢
我已设法使用下面的代码将col_2
转换为factor
,但它并不是一个最佳答案,因为我不得不查找所有列名,使用Python方法而不是R找到所需列的索引,然后使用它进行重新分配。
col_2_index = list(r_df.colnames).index('col_2')
col_2 = robjects.vectors.FactorVector(r_df.rx2('col_2'))
r_df[assessor_col_index] = col_2
理想情况下,我希望看到一种不依赖于查找列索引的重新分配方法。但是,我以前的尝试抛出了以下错误:
r_df['col_2'] = converted_col
TypeError: SexpVector indices must be integers, not str
或
r_df.rx2('col_2') = converted_col
SyntaxError: can't assign to function call