2015-07-01 2 views
1

Как и многие, я надеюсь остановить трансграничные миры R и Python и просто работать на Python, используя Pandas, Pyr2, Numpy и т. Д. Я использую R-пакет ez для своего устройства ezANOVA. Это работает, если я делаю что-то трудное, но почему это не работает, когда я делаю их легко? Я не понимаю, в результате ошибки:pandas и rpy2: Почему ezANOVA работает через robjects.r, но не robjects.packages.importr?

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 

Смотрите ниже для полного воспроизводимым кода (требует некоторых питона пакетов: pyr2, панды, NumPy):

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 

ответ