Menu
CoddyTech

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 cuyo nombre coincide con el elemento correspondiente de groups. El resultado es una lista con un elemento por grupo, cuyos nombres corresponden a 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"]])

Resultado:

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

Combina split() con sapply() para calcular un resumen por 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 la cantidad de importes de esa categoría.

El código proporcionado lee los importes y las categorías en dos líneas separadas por comas y de la misma 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 proporcionado: 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