我有一个R数据框,在Database02.Rda中保存。加载它。
import rpy2.robjects as robjects
robjects.r.load("Database02.Rda")
工作得很好。然而:
print(robjects.r.names("df"))
产量
NULL
此外,以列214(如果我们从0开始计数,则为213)为例,其名称为REGION。
print(robjects.r.table(robjects.r["df"][213]))
运行正常:
Region 1 Region 2 ...
9811 3451 ...
但我们也应该能够做到。
print(robjects.r.table("df$REGION"))
然而,这会导致...
df$REGION
1
(它也会对根本不存在的列名进行操作);另外:
print(robjects.r.table(robjects.r["df"]["REGION"]))
出现错误:
TypeError: SexpVector indices must be integers, not str
现在,文档中说,在Python中不能使用名称进行子集操作。我是否正确地认为,在使用Python/rpy2加载数据帧时,列名没有与其他数据一起导入?因此,最简单的访问方法是将它们保存并加载为单独的列表,并在Python中构建一个映射名称到列索引号的字典等。然而,这似乎不太通用。有没有直接提取列名的方法?
我使用的R、Python和rpy2版本是: R: 3.2.2 Python: 3.5.0 rpy2: 2.7.8
df.rx2()
不会返回列本身的内容,而是用某种唯一标识符(介于1和该列中唯一元素数量之间的整数)替换它们。例如,robjects.r.head(df.rx("REGION"))
返回[ 15, 18, 9, 15, 15, 15]
而不是Region 1, Region 4, Region 9, Region 1, ...
。即使对于具有 int 值的列也是如此,这使得任何数据分析都无法使用。事实上,我不知道 rx2() 方法是做什么的;我找不到帮助页面。 - 0rangeas_character = robjects.r['as.character']
然后执行as_character(df.rx2("REGION"))
或者as_character(robjects.r["df"][colnames.index("REGION")])
。对于应该是数字的变量(在我的情况下,这个错误,将数值数据作为字符处理,“10”而不是10,已经在Rda文件中存在,我在此期间发现),请执行as_numeric(as_character(df.rx2("NUMERIC_VAR")))
。 - 0rangedfr = dfr.rx2(co) # where co = ["a", "b"]
对我来说不起作用。它应该吗?如果不是,那么我该如何按名称选择多列? - The Unfun Catco
必须是 R 向量或 Python 标量类型之一,可以转换为 R 向量。使用rpy2.robjects.vectors.StrVector
构建co
。 - lgautier