Resúmenes de grupos
Parte de la sección Lógica y flujo del Journey de R de Coddy. Lección 40 de 64.
tapply(values, groups, f) agrupa los valores y aplica f a cada grupo en una sola llamada. Da el mismo resultado que sapply(split(values, groups), f):
amounts <- c(10, 20, 30, 40)
category <- c("food", "rent", "food", "fun")
print(tapply(amounts, category, sum))
print(tapply(amounts, category, max))Salida:
food fun rent
40 40 20
food fun rent
30 40 20 El resultado se nombra por grupo en orden alfabético, por lo que [[ ]] lee un grupo y names() los enumera:
amounts <- c(10, 20, 30, 40)
category <- c("food", "rent", "food", "fun")
avg <- tapply(amounts, category, mean)
print(avg[["food"]])
print(names(avg))Salida:
[1] 20
[1] "food" "fun" "rent"La función de resumen puede ser propia. Aquí cuenta los pedidos superiores a 25 en cada grupo:
amounts <- c(10, 20, 30, 40)
category <- c("food", "rent", "food", "fun")
print(tapply(amounts, category, function(v) sum(v > 25)))Salida:
food fun rent
1 1 0 El resultado es un vector con nombres, por lo que sort() y which.max() encuentran el grupo más grande. which.max() devuelve el primero de los valores iguales:
amounts <- c(10, 20, 30, 40, 5)
category <- c("food", "rent", "food", "fun", "rent")
totals <- tapply(amounts, category, sum)
print(names(totals)[which.max(totals)])
print(names(sort(totals, decreasing = TRUE)))Salida:
[1] "food"
[1] "food" "fun" "rent"Desafío
FácilCompleta city_report(cities, temps). Devuelve una línea por ciudad en orden alfabético, oslo: avg 4.5, max 9, con la temperatura media redondeada a un decimal y la temperatura más alta. Después añade Warmest: seguido de la ciudad con la media más alta (la primera alfabéticamente cuando las medias coinciden).
El código proporcionado lee las ciudades y las temperaturas como dos líneas separadas por comas y de igual longitud, e imprime cada línea devuelta.
Pruébalo tú mismo
city_report <- function(cities, temps) {
# Escribe tu código aquí
character(0)
}
# Código de entrada/salida suministrado: mantenlo como está
input <- suppressWarnings(readLines(file("stdin")))
cat(city_report(strsplit(input[1], ",")[[1]], as.numeric(strsplit(input[2], ",")[[1]])), sep = "\n")
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
1Cadenas a fondo
Subcadenas con substr()Formateo con sprintf()Dividir y unirBuscar cadenasReemplazar textoRepaso - Constructor de nombres de usuario4Matrices
Creación de matricesIndexación de matricesResúmenes de filas y columnasAritmética de matricesRepaso: tabla de asientos2Búsquedas clave-valor
Búsquedas en vectores con nombreComprobar clavesAñadir y eliminar clavesRecorrer nombresRepaso: panel bursátil5Proyecto - Libro de calificaciones
Añadir estudiantesRegistrar calificaciones8Ordenación y agrupación
Ordenar vectoresOrdenar por una claveAgrupar con split()Resúmenes de gruposRepaso - Clasificación3Conjuntos y conteo
Valores únicosOperaciones con conjuntosPruebas de pertenenciaConteo con table()Repaso: invitados al evento6Funciones como valores
Funciones anónimasPasar funcionesDevolver funcionesClausuras con estadoRepaso: reglas de descuento9Marcos de datos
Creación de marcos de datosColumnas y filasFiltrado de filasAdición y ordenaciónRepaso - Informe de ventas12Proyecto: Rastreador de gastos
Registro de gastosGasto totalPractica por tu cuenta: Compilador de R online