2016-03-02 84 views
0

我正在嘗試Rpy2並感覺非常困難。我在我的熊貓數據幀過去了,跑了使用RPy2將lme4 ranef輸出轉換爲數據幀

m_rt = lme4.lmer(formula,verbose=True) 
out = r.ranef(m_rt) 

混合效應模型如果我打印出來,它看起來如預期:

$cat 
       (Intercept) gen  delta 
x  0.093546331 -0.168458284 0.144213098 
y  -0.082592717 0.148733010 -0.127326764 
z  0.005229467 -0.009417228 0.008061863 

現在我想通過這些信息反饋到大熊貓數據幀。或者真的,我可以使用任何python對象!我試圖pandas2ri.ri2py(out)並獲得

<ListVector - Python:0x118b53248/R:0x7fe3663a3238> 
[DataFrame] 
<ListVector - Python:0x118b53248/R:0x7fe3663a3238> 
[DataFrame] 

r.data.frame(out),得到了AttributeError: 'SignatureTranslatedFunction' object has no attribute 'frame' 。由於與熊貓數據框架定義有衝突,我無法安裝dplyr - 也許這就是原因。這是正常的嗎?下面的錯誤:

LibraryError: Conflict when converting R symbols in the package "dplyr" to Python symbols: 
-obj_type_data_frame -> obj_type.data_frame, obj_type.data.frame 
To turn this exception into a simple warning use the parameter `on_conflict="warn"\` 

任何幫助非常感謝!謝謝!

+0

數據框被包裹在一個列表中。 –

+0

你有什麼版本的rpy2? 'import rpy2;打印(rpy2 .__版本__)' – lgautier

+0

我有版本2.7.8 – Erin

回答

1

好吧,有一種比我更容易做到這一點的方法。使用模板我已經從here

from rpy2.robjects import pandas2ri 
pandas2ri.activate() 
r_df = pandas2ri.py2ri(p_df) 

# add all the fields to an environment 
env = Environment() 
for varname in r.colnames(r_df): 
    env[varname] = r_df(varname) 

formula = Formula('x ~ gen + delta + (1 + gen + delta | cat)', 
       environment=env) 
m_rt = lme4.lmer(formula,verbose=True) 

從那裏能print r.summary(m_rt)print r.fixef(m_rt),但不能得到更多的工作。

但是,一個更簡單的方法(我在jupyter筆記本電腦),是:

%load_ext rpy2.ipython 
%Rpush p_df 

(下一頁細胞)

%%R 
library(lme4) 
m_rt <- lmer(x ~ gen + delta + (1 + gen + delta | cat)), 
     data = p_df) 

rfs <- ranef(m_rt)$cat 
ffs <- fixef(m_rt) 

(下一頁細胞)

%Rpull rfs 
%Rpull ifs 

而且瞧,rfs現在是一個熊貓數據框架,ffs是一個數組。

1

錯誤消息在這裏試圖幫助你:

要打開此異常到一個簡單的警告使用參數on_conflict="warn"\

這樣的建議會讓你輸入dplyr

dplyr = importr("dplyr", on_conflict="warn") 

這是做什麼in rpy2's own wrapper for dplyr。 雖然在它你可能想使用該包裝,如果有興趣dplyr(這是covered in the doc)。