Сохранять значения индекса данных R при преобразовании в кадр данных Pandas

1

Подходящая модель смешанных эффектов с использованием пакета LME4 R (базовая версия 3.5.2), запускается через rpy2 2.9.4 из Python 3.6

Возможность печати случайных эффектов в виде индексированного информационного кадра, где значения индекса представляют собой значения категориальной переменной (ей), используемой для определения групп (с использованием данных радона):

import rpy2.robjects as ro
from rpy2.robjects import pandas2ri, default_converter
from rpy2.robjects.conversion import localconverter
from rpy2.robjects.packages import importr

lme4 = importr('lme4')

mod = lme4.lmer(**kwargs) # Omitting arguments for brevity
r_ranef = ro.r['ranef']
re = r_ranef(mod)
print(re[1])
                           Uppm   (Intercept)         floor   (Intercept)
AITKIN            -0.0026783361 -2.588735e-03  1.742426e-09 -0.0052003670
ANOKA             -0.0056688495 -6.418760e-03 -4.482764e-09 -0.0128942943
BECKER             0.0021906431  1.190746e-03  1.211201e-09  0.0023920238
BELTRAMI           0.0093246041  8.190172e-03  5.135196e-09  0.0164527872
BENTON             0.0018747838  1.049496e-03  1.746748e-09  0.0021082742
BIG STONE         -0.0073756824 -2.430404e-03  0.000000e+00 -0.0048823057
BLUE EARTH         0.0112939204  4.176931e-03  5.507525e-09  0.0083908075
BROWN              0.0069223055  2.544912e-03  4.911563e-11  0.0051123339

Преобразовывая это в pandas DataFrame, категориальные значения теряются из индекса и заменяются целыми числами:

pandas2ri.ri2py_dataframe(r_ranef[1])  # r_ranef is a dict of dataframes

    Uppm  (Intercept)         floor  (Intercept)
0  -0.002678    -0.002589  1.742426e-09    -0.005200
1  -0.005669    -0.006419 -4.482764e-09    -0.012894
2   0.002191     0.001191  1.211201e-09     0.002392
3   0.009325     0.008190  5.135196e-09     0.016453
4   0.001875     0.001049  1.746748e-09     0.002108
5  -0.007376    -0.002430  0.000000e+00    -0.004882
6   0.011294     0.004177  5.507525e-09     0.008391
7   0.006922     0.002545  4.911563e-11     0.005112

Как мне сохранить значения исходного индекса?

Документ предполагает as.data.frame может содержать grp, которые могут быть значения, что я после, но я изо всех сил, чтобы осуществить это через rpy2; например,

r_ranef = ro.r['ranef.as.data.frame']

не работает

  • 0
    Изолированная проблема для pandas2ri.ri2py_dataframe , которая отбрасывает индекс pandas2ri.ri2py_dataframe данных R
  • 0
    Какая у вас версия rpy2 : print(rpy2.__version__) или pip show rpy2 ? Начиная с версии 2.7.3 , имя строки фрейма данных R распространяется как индекс в фрейме данных pandas с использованием pandas2ri.ri2py_dataframe .
Показать ещё 1 комментарий
Теги:
rpy2
lme4

2 ответа

0

Рассмотрите возможность добавления row.names в качестве нового столбца в фрейме данных R, а затем используйте этот столбец для set_index в фрейме данных Pandas:

base = importr('base')

# ADD NEW COLUMN TO R DATA FRAME
re[1] = base.transform(re[1], index = base.row_names(re[1]))

# SET INDEX IN PANDAS DATA FRAME
py_df = (pandas2ri.ri2py_dataframe(re[1])
                     .set_index('index')
                     .rename_axis(None)
        )

И чтобы сделать это для всех фреймов данных в списке, используйте цикл R lapply а затем понимание списка Python для новых фреймов данных, проиндексированных Pandas.

base = importr('base')

mod = lme4.lmer(**kwargs)          # Omitting arguments for brevity
r_ranef = lme4.ranef(mod)

# R LAPPLY
new_r_ranef = base.lapply(r_ranef, lambda df: 
                          base.transform(df, index=base.row_names(df)))

# PYTHON LIST COMPREHENSION
py_df_list = [(pandas2ri.ri2py_dataframe(df)
                         .set_index('index')
                         .rename_axis(None)
              ) for df in new_r_ranef]
0
import rpy2.robjects as ro
from rpy2.robjects import pandas2ri, default_converter
from rpy2.robjects.conversion import localconverter

r_dataf = ro.r("""
data.frame(
  Uppm = rnorm(5),
  row.names = letters[1:5]
)
""")

with localconverter(default_converter + pandas2ri.converter) as conv:
    pd_dataf = conv.rpy2py(r_dataf)

# row names are "a".."f"
print(r_dataf)

# row names / indexes are now 0..4
print(pd_dataf)

Вероятно, это незначительная ошибка/отсутствующая функция в rpy2, но обходной путь довольно прост:

with localconverter(default_converter + pandas2ri.converter) as conv:
    pd_dataf = conv.rpy2py(r_dataf)
pd_dataf.index = r_dataf.rownames
  • 0
    Согласно указанному исправлению ошибки в комментарии, почему оригинальное преобразование не работало для переноса имен строк с помощью pandas2ri.ri2py_dataframe ?
  • 0
    Вероятно, регрессия ... и не было никакого модульного теста, чтобы поймать его. Теперь это отслеживается на bitbucket.org/rpy2/rpy2/issues/484/… .
Показать ещё 5 комментариев

Ещё вопросы

Сообщество Overcoder
Наверх
Меню