Menu
Coddy logo textTech

Regrouper avec split()

Fait partie de la section Logique et flux d’exécution du Journey R de Coddy. Leçon 39 sur 64.

split(values, groups) place chaque valeur dans le groupe nommé par l’élément correspondant de groups. Le résultat est une liste contenant un élément par groupe, nommée d’après les groupes dans l’ordre trié :

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"]])

Sortie :

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

Combinez split() avec sapply() pour calculer un résumé par groupe :

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))

Résultat :

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

Les valeurs peuvent aussi être du texte, par exemple pour regrouper les noms selon leur première lettre :

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")
}

Résultat :

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

Un groupe n’existe que lorsqu’au moins une valeur lui appartient ; vérifiez donc avec %in% names() avant de lire un groupe qui pourrait être vide :

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

Sortie :

[1] FALSE
challenge icon

Défi

Facile

Complétez category_totals(amounts, categories). Renvoyez une ligne par catégorie dans l’ordre alphabétique, food: 40 (2 items), avec le montant total et le nombre de montants dans cette catégorie.

Le code fourni lit les montants et les catégories sous forme de deux lignes séparées par des virgules et de même longueur, puis affiche chaque ligne renvoyée.

Essayez vous-même

category_totals <- function(amounts, categories) {
  # Écrivez votre code ici
  character(0)
}

# Code d'entrée/sortie fourni : conservez-le tel quel
input <- suppressWarnings(readLines(file("stdin")))
cat(category_totals(as.numeric(strsplit(input[1], ",")[[1]]), strsplit(input[2], ",")[[1]]), sep = "\n")
quiz iconTestez-vous

Cette leçon comprend un petit quiz. Commencez la leçon pour y répondre et suivre votre progression.

Toutes les leçons de Logique et flux d’exécution

Entraînez-vous par vous-même : Compilateur R en ligne