Menu
Coddy logo textTech

Agrupar con split()

Parte de la sección Lógica y flujo del Journey de R de Coddy. Lección 39 de 64.

split(values, groups) coloca cada valor en el grupo nombrado por el elemento correspondiente de groups. El resultado es una lista con un elemento por grupo, nombrada según los grupos en orden alfabético:

amounts <- c(10, 20, 30, 40)
category <- c("food", "rent", "food", "fun")
by_cat <- split(amounts, category)
print(names(by_cat))
print(by_cat[["food"]])

Salida:

[1] "food" "fun"  "rent"
[1] 10 30

Combina split() con sapply() para calcular un resumen por cada grupo:

amounts <- c(10, 20, 30, 40)
category <- c("food", "rent", "food", "fun")
by_cat <- split(amounts, category)
print(sapply(by_cat, sum))
print(sapply(by_cat, length))

Salida:

food  fun rent 
  40   40   20 
food  fun rent 
   2    1    1 

Los valores también pueden ser texto, por ejemplo, para agrupar nombres por su primera letra:

names <- c("ana", "bo", "al", "bea", "cy")
groups <- split(names, substr(names, 1, 1))
for (letter in names(groups)) {
  cat(letter, ":", paste(groups[[letter]], collapse = ", "), "\n")
}

Salida:

a : ana, al 
b : bo, bea 
c : cy 

Un grupo solo existe cuando al menos un valor le pertenece, así que comprueba con %in% names() antes de leer un grupo que podría estar vacío:

by_cat <- split(c(5, 7), c("food", "food"))
print("rent" %in% names(by_cat))

Salida:

[1] FALSE
challenge icon

Desafío

Fácil

Completa category_totals(amounts, categories). Devuelve una línea por categoría en orden alfabético, food: 40 (2 items), con el importe total y el número de importes de esa categoría.

El código proporcionado lee los importes y las categorías como dos líneas separadas por comas de igual longitud e imprime cada línea devuelta.

Pruébalo tú mismo

category_totals <- function(amounts, categories) {
  # Escribe tu código aquí
  character(0)
}

# Código de entrada/salida suministrado: mantenlo tal como está
input <- suppressWarnings(readLines(file("stdin")))
cat(category_totals(as.numeric(strsplit(input[1], ",")[[1]]), strsplit(input[2], ",")[[1]]), sep = "\n")
quiz iconPonte a prueba

Esta lección incluye un breve cuestionario. Empieza la lección para responderlo y registrar tu progreso.

Todas las lecciones de Lógica y flujo

Practica por tu cuenta: Compilador de R online