我有一个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
答案 0 :(得分:4)
执行以下操作时,您将Database02.Rda
中的任何对象加载到R的“全局环境”中。
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)
答案 1 :(得分:2)
如果在python中运行R
代码,则全局环境答案将不起作用。但感谢@lgautier这个包的创建者/维护者。在R
中,经常使用美元符号$。这就是我所学到的:
print(pamk_clusters$pamobject$clusinfo)
将无效,及其等效
print(pamk_clusters[["pamobject"]][["clusinfo"]])
也行不通......但是,经过一些挖掘“男人”
这可以按预期工作
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