Hace un par de días un amigo mío me preguntaba por temas de que quería paralelizar un proceso con R, y no acababa de ver claro cómo. A falta de que mande un ejemplo creí entender que tiene un dataframe dónde tiene un proceso que encuentra para cada fila un conjunto de n filas parecidas y sobre ese conjunto de n filas hace cosas, como estimar algo y tal. Y lo que quiere al final es tener tanto lo estimado como un dataframe con las n filas similares a cada fila original
Bueno, hasta que me mande el ejemplo y me entere bien, me acordé que en R y más concretamente en el mundo tidyverse tenemos los nested data, que nos permite tener columnas cuyos elementos pueden ser cualquier cosa, desde un json, un dataframe, un modelo , etcc..
Veamos un ejemplo
purrr
Show me the code
library(tidyverse)df_nest <-tibble(grupo =c(letters[1:5]),dfs =list(dfa =data.frame(x =rnorm(2000), y =rexp(2000)),dfb =data.frame(x =rnorm(1000), y =rexp(1000)),dfc =data.frame(x =rnorm(30), y =rexp(30)),dfd =data.frame(x =rnorm(200), y =rexp(200)),dfe =data.frame(x =rnorm(1e5), y =rexp(1e5)) ))df_nest#> # A tibble: 5 × 2#> grupo dfs #> <chr> <named list> #> 1 a <df [2,000 × 2]> #> 2 b <df [1,000 × 2]> #> 3 c <df [30 × 2]> #> 4 d <df [200 × 2]> #> 5 e <df [100,000 × 2]>
Y vemos que el primer elemento de la columna dfs es un dataframe de 2000 filas y 2 colmnas y que el quinto tiene 100 mil filas de filas y dos columnas. Esta forma de tener la información puede ser útil, o al menos a mi me lo parece.
¿Podríamos ahora hacer, por ejemplo un modelo sobre cada elemento de dfs? Si, y de manera muy sencilla utilizando funciones de purrr ya incluida con tidyverse
¿Y podemos hacer todo esto en paralelo? Pues si, y muy fácil con la librería furrr que usa la fantástica future. Con future podemos usar múltiples procesadores, múltiples sesiones, o incluso montar un cluster sobre varias máquinas usando MPI (eso si era computación distribuida y no spark , que me lo ha contado mi amigo Rubén, que fue sysadmin en uno de esos sistemas).
Para usar furrr aparte de instalarlo lo que tenemos que especificar es el tipo de plan, yo recomiendo usar plan(multisession) que no da problemas con Rstudio como si da plan(multiprocess)