有没有办法访问 python/rpy2 中的 R 数据框列名?

Is there a way to access R data frame column names in python/rpy2?

我有一个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

现在,docs 说,名称不能用于 python 中的子集化。当使用 python/rpy2 加载数据框时,我假设列名没有与其余数据一起导入是否正确?因此,我是否正确认为访问它们的最简单方法是将它们作为单独的列表保存和加载,并在 python 中构造一个字典左右,将名称映射到列索引号?然而,这似乎不是很通用。有没有办法直接提取列名?

我使用的R、python、rpy2的版本是: 回复:3.2.2 python:3.5.0 rpy2: 2.7.8

执行以下操作时,您将 Database02.Rda 中的任何对象加载到 R 的 "global environment".

import rpy2.robjects as robjects
robjects.r.load("Database02.Rda")

robjects.globalenv 是一个 Environement。您可以列出其内容:

tuple(robjects.globalenv.keys())

现在我了解到您的一件物品叫做 df。您可以通过以下方式访问它:

df = robjects.globalenv['df']

如果 df 是列表或数据框,您可以访问其命名元素 rx2(又是the doc is your friend)。要获得名为 REGION 的那个,请执行:

df.rx2("REGION")

列出列表或数据框中的所有命名元素很简单:

tuple(df.names) 

如果您 运行 R 在 python 中编写代码,全局环境答案将不起作用。但是感谢@lgautier 这个包的creator/maintainer。在 R 中,美元符号 $ 被频繁使用。这是我学到的:

print(pamk_clusters$pamobject$clusinfo)

将不起作用,其等价物

print(pamk_clusters[["pamobject"]][["clusinfo"]])

也行不通...但是,在 "man"

中进行了一些挖掘之后

http://rpy2.readthedocs.io/en/version_2.7.x/vector.html#extracting-r-style

通过两个委托人 rx 和 rx2 授予对 R 风格 extracting/subsetting 的访问权限,分别代表 R 函数 [ 和 [[。

这按预期工作

print(pamk_clusters.rx2("pamobject").rx2("clusinfo"))

我在论坛上评论 "man" 清晰度:

https://bitbucket.org/rpy2/rpy2/issues/436/acessing-dataframe-elements-using-rpy2

我在 ipython 的 Win7 上使用 rpy2。为了帮助其他人深入了解格式,这里有一个似乎有效的设置:

import rpy2
import rpy2.robjects as robjects
import rpy2.robjects.packages as rpackages
from rpy2.robjects.packages import importr

base = importr('base')
utils = importr('utils')
utils.chooseCRANmirror(ind=1)

cluster = importr('cluster')
stats = importr('stats')
#utils.install_packages("fpc")
fpc = importr('fpc')

import pickle
with open ('points', 'rb') as fp:
    points = pickle.load(fp) 
# data above is stored as binary object
# online:  http://www.mshaffer.com/arizona/dissertation/points

import rpy2.robjects.numpy2ri as npr   
npr.activate()

k = robjects.IntVector(range(3, 8))   # r-syntax  3:7   # I expect 5
pamk_clusters = fpc.pamk(points,k)

print( base.summary(pamk_clusters) )
base.print( base.summary(pamk_clusters) )

utils.str(pamk_clusters)

print(pamk_clusters$pamobject$clusinfo)
base.print(pamk_clusters$pamobject$clusinfo)

print(pamk_clusters[["pamobject"]][["clusinfo"]])
print(pamk_clusters.rx2("pamobject").rx2("clusinfo"))

pam_clusters = cluster.pam(points,5)        # much slower
kmeans_clusters = stats.kmeans(points,5)    # much faster

utils.str(kmeans_clusters)

print(kmeans_clusters.rx2("cluster"))

R 已经成为统计计算的标准近 25 年了,基于 40 岁的 S - 在计算效率非常重要的时候。 https://en.wikipedia.org/wiki/R_(programming_language)

再次@lgautier,感谢您让 Python

中的 R 更容易访问