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

时间:2016-03-03 19:47:06

标签: python r 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的版本是: R:3.2.2 python:3.5.0 rpy2:2.7.8

2 个答案:

答案 0 :(得分:4)

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

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

robjects.globalenvEnvironement。您可以使用以下内容列出其内容:

tuple(robjects.globalenv.keys())

现在我理解你的一个对象被称为df。您可以使用以下方式访问它:

df = robjects.globalenv['df']

如果df是列表或数据框,则可以使用以下命令访问其命名元素 rx2the doc is your friend再次)。要获得名为REGION的名称,请执行:

df.rx2("REGION")

列出容易的列表或数据框中的所有命名元素:

tuple(df.names) 

答案 1 :(得分:2)

如果在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上使用rpy2和ipython。为了帮助其他人挖掘格式,这里有一个似乎有效的设置:

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年的历史,基于四十年前的S - 计算效率非常重要。 https://en.wikipedia.org/wiki/R_(programming_language)

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