首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >熊猫和rpy2:为什么ezANOVA通过robjects.r而不是robjects.packages.importr工作?

熊猫和rpy2:为什么ezANOVA通过robjects.r而不是robjects.packages.importr工作?
EN

Stack Overflow用户
提问于 2015-07-01 18:58:29
回答 1查看 348关注 0票数 1

和许多人一样,我希望停止跨越R和Python,只在Python中使用Pandas、Pyr2、Numpy等等。我使用R作为其ezANOVA工具。--如果我用困难的方式做事,它就能工作,但当我用简单的方式做事情时,它为什么不起作用呢?,我不理解由此产生的错误:

代码语言:javascript
复制
File "/Users/malcomreynolds/analysis/r_with_pandas.py", line 38, in <module>
    res = ez.ezANOVA(data=testData, dv='score', wid='subjectid', between='block', detailed=True)
  File "/usr/local/lib/python2.7/site-packages/rpy2/robjects/functions.py", line 178, in __call__
    return super(SignatureTranslatedFunction, self).__call__(*args, **kwargs)
  File "/usr/local/lib/python2.7/site-packages/rpy2/robjects/functions.py", line 106, in __call__
    res = super(Function, self).__call__(*new_args, **new_kwargs)
rpy2.rinterface.RRuntimeError: Error in table(temp[, names(temp) == wid]) : 
  attempt to set an attribute on NULL

有关完整的可复制代码,请参见下面的代码(需要一些python包: pyr2、熊猫、numpy):

代码语言:javascript
复制
import pandas as pd
from rpy2 import robjects
from rpy2.robjects import pandas2ri
pandas2ri.activate()  # make pyr2 accept and auto-convert pandas dataframes
from rpy2.robjects.packages import importr
base = importr('base')
ez = importr('ez')
robjects.r['options'](warn=-1)  # ???
import numpy as np

"""Make pandas data from from scratch"""

score = np.random.normal(loc=10, scale=20, size=10)
subjectid = range(10)
block = ["Sugar"] * 5 + ["Salt"] * 5
testData = pd.DataFrame({'score':score, 'block':block, 'subjectid': subjectid})
# it looks just like a dataframe from R
print testData

"""HARD WAY: Use ezANOVA thorugh pyr2 *** THIS WORKS ***"""
anova1 = robjects.r("""
library(ez)
function(df) {
    # df gets passed in
    ezANOVA(
        data=df,
        dv=score,
        wid=subjectid,
        between=block,
        detailed=TRUE)
}
""")
print anova1(testData)


# this command shows that ez instance is setup properly
print ez.ezPrecis(data=testData)  # successful

"""EASY WAY: Import ez directly and use it """
# *** THIS APPROACH DOES NOT WORK ***
# yet, trying to use ez.ezANOVA yields an excpetion aboutthe wid value
# res = ez.ezANOVA(data=testData, dv='score', wid='subjectid', between='block', detailed=True)
# print res

# *** THIS APPROACH WORKS (and also uses my options change) ***
res = ez.ezANOVA(data=testData, dv=base.as_symbol('score'), wid=base.as_symbol('subjectid'), between=base.as_symbol('block'))
print res
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-07-01 20:18:48

在简单版本中,您将符号名作为字符串传递。这和符号不一样。

检查as_symbolMinimal example of rpy2 regression using pandas data frame中的使用情况

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31169496

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档