Pandas und rpy2: Warum funktioniert ezANOVA über robjects.r aber nicht robjects.packages.importr?

Wie viele, ich hoffe zu stoppen Straddling R und Python Welten und nur in Python mit Pandas, Pyr2, Numpy, etc. arbeiten Ich bin mit dem R-Paket ez für seine ezANOVA-Anlage. Es funktioniert, wenn ich die Dinge auf die harte Art mache, aber warum funktioniert es nicht, wenn ich ihnen den einfachen Weg mache? Ich verstehe den daraus resultierenden Fehler nicht:

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 

Siehe unten für voll reproduzierbaren Code (erfordert einige Python-Pakete: pyr2, Pandas, 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 

One Solution collect form web for “Pandas und rpy2: Warum funktioniert ezANOVA über robjects.r aber nicht robjects.packages.importr?”

In der einfachen Version übergeben Sie Symbolnamen als Strings. Dies ist nicht das gleiche wie ein Symbol.

Überprüfen Sie die Verwendung von as_symbol in Minimal Beispiel für rpy2 Regression mit Pandas Datenrahmen

  • Wie kann ich pyspark RDDs mit R-Funktionen partitionieren
  • Rpy2 (Version 2.3.10) - Import von Daten aus R-Paket in Python
  • Rpy2-Fenster kann nicht aufgelöst werden
  • Python rpy2 und quantmod Beispiele
  • Rpy2-Fehler wac-a-mol: R_USER nicht definiert
  • Speicher löschen von rpy2
  • Rpy2 arbeitet in der Konsole, kann aber nicht per Website importiert werden (mit Fehler "R_isMethodsDispatchOn")
  • R-Ausgabe als Spalten lesen
  • Unterschied in Python statsmodels OLS und R's lm
  • LD_LIBRARY_PATH-Präzision und Schwierigkeiten beim Kompilieren
  • Wie können Rpy2, Pyrserve und PypeR vergleichen?
  • Python ist die beste Programmiersprache der Welt.