Python dispone de un gran ecosistema para el cálculo numérico, el análisis estadístico y el aprendizaje automático. Siendo el entorno favorito de muchos científicos de datos. Por otro lado, R es también un gran entorno para el análisis estadístico que dispone de una amplia colección de paquetes. A pesar de ellos, cada uno tiene sus ventajas e inconvenientes. Por este motivo trabajar al mismo tiempo con ambos puede ofrecer grandes oportunidades, al utilizar las fortalezas de uno para suplir los puntos débiles del otro. Para ello en Python existe la librería rpy2 con la que se puede ejecutar directamente código R. Pudiendo acceder de este modo a toda la potencia que puede ofrecer R desde Python.
Instalación y uso básico de rpy2
Para poder trabajar a la vez con R y Python es necesario instalar ambos entornos en el mismo sistema. Ahora para utilizar R desde Python es necesario instalar en el segundo la librería rpy2. Para ello solamente se ha de escribir la siguiente orden en la línea de comandos:
pip install rpy2
Ahora para ejecutar código R en Python solamente se ha de importar el objeto r
de rpy2.robjects
. Este objeto al recibir una cadena de texto con comandos R los ejecuta inmediatamente. Por ejemplo, imprimir el mensaje ¡Hola Mundo!
.
from rpy2.robjects import r r('print("¡Hola Mundo!")')
En el caso de que sea necesario utilizar más de una línea se puede utilizar la cadena con tres comillas ’’’
. Por ejemplo, para ejecutar un bucle for
en R.
r(''' suma <- 0 for (i in 1:10) { suma <- suma + i } print(suma)''')
Mover datos entre Python y R
Lo que se ha visto hasta ahora de la librería rpy2 ya es interesante por si, poder utilizar todo el potencial de R desde Python. Aun así, en la mayoría de las ocasiones es necesario intercambiar datos. Para asignar una variable R desde Python es necesario emplear el método assign
del objeto r
. Al que en primer lugar se le indica el nombre de la variable en R y en segundo el valor. Para recuperar los valores simplemente se emplea la función el objeto r
, el cual devuelve los resultados de la línea de R. Por ejemplo, en el siguiente código se muestra como asignar una variable en R desde Python, operar con ella en R y finalmente recuperar el resultado en Python.
# Asignar 10 a x en R r.assign('x', 10) # Imprimir el valor de x en R r('print(x)') # Operar con x y recuperar el valor r('y <- x * 3') r('print(y)') y = r('y') # Ahora en Python se puede acceder al valor de y print(y[0])
Operar con matrices entre Python y R
A la hora de mover matrices entre Python y R es necesario previamente crear un objeto válido desde Python. Esto se ha de realizar con el método matrix
del objeto r
, el cual funciona exactamente igual que su homólogo en R. El primer parámetro del método son los valores de la matriz. Posteriormente es necesario indicar el número de filas y columnas de la matriz con nrow
y ncol
respectivamente. Opcionalmente se puede indicar si esta se va a rellenar por filas o columnas. En el siguiente ejemplo se muestra como realizar esta tarea.
x = r.matrix(list(range(9)), nrow=3, ncol=3, byrow=True) r.assign('x', x) r('print(x)') # Resultado # [,1] [,2] [,3] # [1,] 0 1 2 # [2,] 3 4 5 # [3,] 6 7 8 x = r.matrix(list(range(9)), nrow=3, ncol=3, byrow=False) r.assign('x', x) r('print(x)') # Resultado # [,1] [,2] [,3] # [1,] 0 3 6 # [2,] 1 4 7 # [3,] 2 5 8
Operar con objetos numpy entre Python y R
Cuando se utilicen objetos numpy en lugar de objetos listas de Python en necesario importar y activar numpy2ri
. Este objeto se puede localizar en rpy2.robjects
y para activarlo se ha de llamar a su método activate()
. En caso de que no activar este componente el método matrix
dará un error. A modo de ejemplo en el siguiente código se muestra como crear una matriz a partir de un array de numpy.
import numpy as np from rpy2.robjects import numpy2ri numpy2ri.activate() x = r.matrix(np.array(range(9)), nrow=3, ncol=3) r.assign('x', x) r('print(x)')
Operar con objetos DataFrame de pandas entre Python y R
El intercambio de objetos DataFrame entre Python y R se realiza mediante el objeto pandas2ri
. Al igual que el equivalente para numpy visto anteriormente este se encuentra rpy2.robjects
y ha de ser importado y activado. Una vez activado para asignar un DataFrame se ha de crear primero un objeto válido con pandas2ri.py2ri
y posteriormente asignar a una variable de R.
from pandas import DataFrame from rpy2.robjects import pandas2ri pandas2ri.activate() df = DataFrame.from_dict({'a': [8, 21, 23], 'b': [7, 8, 4], 'c': [400, 83, 98]}) r.assign('df', pandas2ri.py2ri(df)) r('print(df)')
Importar paquetes de R
Otra funcionalidad importante de rpy2 es la posibilidad de importar paquetes de R para emplear directamente desde Python. Esta importación se puede realizar con el comando importr()
indicando en nombre de paquete y asignándole a una variable. En el siguiente ejemplo se muestra como importar el paquete utils
de R y recuperar las noticias de la última versión de R instalada.
from rpy2.robjects.packages import importr utils = importr('utils') utils.news()
Conclusiones
Al finalizar esta entrada sabemos cómo emplear la librería de rpy2 para utilizar R desde Python. Pudiendo acceder así a todo el potencial que ofrece R en Python. Integrando de esta forma las ventajas de ambos entornos en uno único y más productivo. Una de las principales ventas de conocer esta librería es poder utilizar los paquetes de R para los que no existe un equivalente nativo en Python.
En una futura entrada se publicará un ejemplo de uso de esta librería para mejorar su potencial. Concretamente en el se implementará una regresión lineal con rpy2.
Imágenes: Pixabay (Couleur)
Dnaiz dice
Estimados me parece excelente el ejemplo dado.
Una pregunta ¿como puedo trabajar con rpy2 en python version 2.7?
Gracias de antemano por la respuesta
Daniel Rodríguez dice
Las versiones actuales de ryp2 no funcionan con Python 2.7. La única opción para poder trabajar es usar una versión antigua de ryp2. Creo que la última versión de ryp2 con soporte para Python 2.7 es la 2.8.6.
Yo aconsejaría ir haciendo la migración a Python 3, cada vez hay menos librerías cuyas actualizaciones funcionan con 2.7. En caso de trabajar con Anaconda he publicado una entrada en la que explico como disponer de más de una versión de Python. Lo que es muy útil cuando existen problemas de compatibilidad con algún código antiguo que no funciona con Python 3.
ErikaR dice
Hola, gracias por el tutorial,
Sólo una pregunta, cuando ejecuto la línea “from rpy2.robjects import r”
me marca el error ” R_USER not defined”… Sabes qué puede ser?
Muchas gracias de antemano.
Saludos.
Daniel Rodríguez dice
Lo mas probable es que falte por configurar la variable de entorno R_USER. Es un problema que se da mas en máquinas Windows, por lo que a lo mejor lo que indican en este enlace puede ayudar: https://bitbucket.org/rpy2/rpy2/issues/95/automagic-settings-for-windows.