有没有办法在 python/rpy2 中访问 R 数据帧列名称



我有一个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蟒蛇:3.5.0RPY2: 2.7.8

执行以下操作时,您将Database02.Rda的任何对象加载到 R 的"全局环境"中。

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

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

tuple(robjects.globalenv.keys())

现在我明白你的一个对象叫做df.您可以通过以下方式访问它:

df = robjects.globalenv['df']

如果df是列表或数据框,则可以使用 rx2(文档又是你的朋友)。要获取名为 REGION 的那个,请执行以下操作:

df.rx2("REGION")

要列出列表或数据帧中的所有命名元素,这很简单:

tuple(df.names) 

如果你在python中运行R代码,全局环境答案将不起作用。 但是@lgautier这个包的创建者/维护者值得称赞。 在R中,美元符号$经常被使用。 这是我学到的:

print(pamk_clusters$pamobject$clusinfo)

将不起作用,及其等效物

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

也行不通...然而,经过对"男人"的一些挖掘

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

通过两个委托器 rx 和 rx2 授予对 R 样式提取/子集的访问权限,分别表示 R 函数 [ 和 [[。

这按预期工作

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

我在论坛上评论了"男人"的清晰度:

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

我在 Win7 和 ipython 上使用 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"))

近 25 年来,R 一直是统计计算的标准,基于一个已有 40 年历史的S——当时计算效率非常重要。https://en.wikipedia.org/wiki/R_(programming_language)

再次@lgautier,感谢您使R在Python中更容易访问

最新更新