有没有方法可以访问python/rpy2中的R数据帧列名?

2024-06-01 04:02:56 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个R数据帧,保存在Database02.Rda中。正在加载

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

工作正常。但是:

^{pr2}$

收益率

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构造一个dict或类似的dict,将名称映射到列的索引号,这是否正确?然而,这似乎不是很普遍。有没有直接提取列名的方法?在

我使用的R、python、rpy2版本有: R: 3.2.2条 python:3.5.0 卢比2:2.7.8


Tags: 数据方法import名称dfastableload
2条回答

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

print(pamk_clusters$pamobject$clusinfo)

不会起作用,以及它的等效物

^{pr2}$

也不会起作用。。。不过,在挖了一番“男人”之后

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

通过代表R函数[和[]的两个delegator rx和rx2授予对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中更容易访问

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

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

robjects.globalenv是一个Environement。您可以通过以下方式列出其内容:

^{pr2}$

现在我了解到您的一个对象名为df。您可以通过以下方式访问它:

df = robjects.globalenv['df']

如果df是一个列表或数据框,则可以使用 rx2(这里又是the doc is your friend)。要获得名为REGION的文件,请执行以下操作:

df.rx2("REGION")

要列出列表或数据框中的所有命名元素,请执行以下操作:

tuple(df.names) 

相关问题 更多 >