Utilizar R desde Python con rpy2

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)

Sin votos
Por favor espera...

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *