0Pricing
R Academy · Lección

map() y variantes tipadas

Aplique funciones sobre listas con map(), map_dbl(), map_chr() y map_lgl().

map() y variantes tipadas es una lección gratuita de R Academy en CoddyKit. Esta es la lección 1 de 4. Puedes leer la lección completa abajo gratuitamente — luego la practicas en el navegador con un editor de código integrado y un tutor de IA 24/7. Forma parte de la ruta de aprendizaje de R Academy, y tu progreso se sincroniza en la web y la app de CoddyKit. El curso de R Academy incluye 4 lecciones en total.

Programación funcional con purrr

El paquete purrr proporciona herramientas coherentes y seguras en cuanto a tipos para la programación funcional en R. En lugar de escribir bucles for, puede mapear una función sobre una lista o un vector. El resultado es un código más limpio, fácil de comprender y de combinar.

library(purrr)

# A list of numbers
numbers <- list(1, 4, 9, 16, 25)

# Apply sqrt() to each element
result <- map(numbers, sqrt)
print(result)

map() — Siempre devuelve una lista

map(.x, .f) aplica la función .f a cada elemento de .x y devuelve una lista. La entrada puede ser una lista, un vector o un data frame (itera sobre las columnas). Esta es la variante de map más general.

library(purrr)

# Map over a character vector
fruits <- c('apple', 'banana', 'cherry')

# nchar() counts characters in each string
result <- map(fruits, nchar)
print(result)  # Returns a list
print(class(result))

map_dbl() — Devuelve un vector numérico

map_dbl(.x, .f) aplica .f a .x y devuelve un vector numérico (double). Si algún resultado no es un único valor numérico, genera un error; esta seguridad de tipos permite detectar errores pronto.

library(purrr)

groups <- list(
  A = c(10, 20, 30),
  B = c(5, 15, 25, 35),
  C = c(100, 200)
)

# Compute mean for each group — returns a named numeric vector
means <- map_dbl(groups, mean)
print(means)
print(class(means))

map_chr() — Devuelve un vector de caracteres

map_chr(.x, .f) aplica la función y devuelve un vector de caracteres. Resulta útil para extraer atributos de texto, dar formato a resultados o crear rutas de archivos. La función debe devolver una única cadena por elemento.

library(purrr)

models <- list(
  m1 = lm(mpg ~ wt, data=mtcars),
  m2 = lm(mpg ~ hp, data=mtcars),
  m3 = lm(mpg ~ cyl, data=mtcars)
)

# Extract the formula from each model as a string
map_chr(models, function(m) deparse(formula(m)))

map_lgl() — Devuelve un vector lógico

map_lgl(.x, .f) devuelve un vector lógico de valores TRUE/FALSE. Es perfecto para comprobar condiciones en una lista; por ejemplo, para verificar qué elementos cumplen un criterio.

library(purrr)

datasets <- list(
  df1 = data.frame(x=1:3, y=c(NA,2,3)),
  df2 = data.frame(x=1:3, y=4:6),
  df3 = data.frame(x=c(NA,NA,3), y=1:3)
)

# Does each data frame contain any NA values?
map_lgl(datasets, function(df) anyNA(df))

map_int() — Devuelve un vector de enteros

map_int(.x, .f) devuelve un vector de enteros. Úselo cuando su función devuelva conteos, índices u otros resultados expresados en números enteros. Nota: en R, length() y nrow() devuelven enteros.

library(purrr)

my_lists <- list(
  a = 1:10,
  b = letters[1:5],
  c = c(TRUE, FALSE, TRUE, TRUE)
)

# Count elements in each list item
map_int(my_lists, length)

map_df() / map_dfr() — Devuelve un Data Frame

map_df(.x, .f) (alias: map_dfr()) aplica .f y combina los resultados por filas en un único data frame. La función debe devolver un data frame o tibble para cada elemento. map_dfc() los combina por columnas.

library(purrr)

files <- c('sales_q1', 'sales_q2', 'sales_q3')

# Simulate reading and labeling each file
map_df(files, function(f) {
  data.frame(
    file = f,
    rows = sample(50:100, 1),
    cols = 5
  )
})

Funciones anónimas con ~

purrr admite una notación abreviada basada en fórmulas para funciones anónimas: ~expr, donde .x hace referencia al elemento actual. Esto evita escribir function(x) expr y mantiene el código conciso. Ambos estilos funcionan de forma idéntica.

library(purrr)

numbers <- list(1, 4, 9, 16, 25)

# Three equivalent ways:
result1 <- map(numbers, function(x) x^2)
result2 <- map(numbers, ~.x^2)
result3 <- map_dbl(numbers, ~.x^2)

print(result2)
print(result3)

Mapeo sobre una lista con nombres

Cuando .x es una lista o un vector con nombres, la salida de map() conserva esos nombres. map_dbl() y las demás variantes tipadas también conservan los nombres, lo que hace que los resultados sean autoexplicativos.

library(purrr)

region_data <- list(
  East = c(100, 120, 115, 130),
  West = c(200, 195, 210, 205),
  North = c(80, 85, 90, 88)
)

# Named results
map_dbl(region_data, mean)

Uso de map() con columnas de data frames

Un data frame es una lista de columnas. map(df, fn) aplica fn a cada columna. Combinado con map_dbl(), ofrece una forma concisa de calcular una estadística para todas las columnas a la vez.

library(purrr)

df <- data.frame(
  score_a = c(85, 90, 78, 92),
  score_b = c(88, 85, 80, 95),
  score_c = c(92, 88, 84, 90)
)

# Mean of every column
map_dbl(df, mean)

Anidación de llamadas a map()

Puede anidar llamadas a map() para realizar iteraciones de varios niveles: un map externo sobre los grupos y otro interno sobre los parámetros. Esto reemplaza los bucles for anidados por una estructura limpia y componible. Para facilitar la lectura, limite la profundidad de anidación a 2 niveles.

library(purrr)

groups <- list(A = 1:5, B = 6:10)
functions <- list(mean=mean, sd=sd, min=min)

# Apply each function to each group
map(groups, function(g) {
  map_dbl(functions, function(f) f(g))
})

Comprobación rápida

¿Cuál es la diferencia principal entre map() y map_dbl()?

Recapitulación: map() y variantes tipadas

Conceptos clave de map() y sus variantes tipadas:

  • map(.x, .f) — siempre devuelve una lista; es la opción más flexible
  • map_dbl() — devuelve un vector numérico; genera un error si el tipo es incorrecto
  • map_chr() — devuelve un vector de caracteres
  • map_lgl() — devuelve un vector lógico
  • map_int() — devuelve un vector de enteros
  • map_df() / map_dfr() — combina los resultados por filas en un data frame
  • ~.x — sintaxis abreviada para funciones anónimas
  • Las entradas con nombres producen automáticamente salidas con nombres
library(purrr)

# Typed map showcase
data_list <- list(
  group_A = c(10, 20, 30),
  group_B = c(5, 15),
  group_C = c(100, 200, 300, 400)
)

cat('Counts:', map_int(data_list, length), '\n')
cat('Means: ', map_dbl(data_list, mean), '\n')
cat('Any>50:', map_lgl(data_list, ~any(.x > 50)), '\n')

Preguntas frecuentes

¿La lección «map() y variantes tipadas» es gratis?

Sí — el texto completo de «map() y variantes tipadas» es gratis para leer aquí en la web. Para practicarla de forma interactiva (editor de código integrado y tutor de IA 24/7) y desbloquear el resto del curso de R Academy, actualiza a CoddyKit PRO. El curso de R Academy incluye 4 lecciones en total.

¿Qué aprenderé en «map() y variantes tipadas»?

Aplique funciones sobre listas con map(), map_dbl(), map_chr() y map_lgl(). Practicas R Academy con código real que ejecutas directamente en el navegador, y un tutor de IA 24/7 responde tus preguntas mientras trabajas en la lección.

¿Necesito experiencia previa para empezar R Academy?

No se requiere experiencia previa. R Academy en CoddyKit está estructurado para principiantes hasta estudiantes avanzados, así que puedes empezar aquí o desde el inicio y avanzar a tu ritmo. Esta es la lección 1 de 4.

¿Cuánto tiempo toma la lección «map() y variantes tipadas»?

La mayoría de las lecciones de CoddyKit toman alrededor de 5–10 minutos. Cada una es compacta e interactiva, así que avanzas constantemente y retomas exactamente por donde dejaste en la web y la app.

¿Puedo escribir y ejecutar código en esta lección de R Academy?

Sí. Cada lección de R Academy incluye un editor de código integrado, así que escribes y ejecutas código real directamente en tu navegador y obtienes retroalimentación instantánea de IA — sin configuración local necesaria.

Todas las lecciones de este curso

  1. map() y variantes tipadas
  2. map2() y pmap() para varias entradas
  3. reduce(), accumulate() y walk()
  4. keep(), discard() y filtrado de listas
← Volver a R Academy