Menu
CoddyTech

Gruppieren mit split()

Teil des Abschnitts Logik und Ablaufsteuerung der R-Journey von Coddy. Lektion 39 von 64.

split(values, groups) ordnet jeden Wert der Gruppe zu, die nach dem passenden Element von groups benannt ist. Das Ergebnis ist eine Liste mit einem Element pro Gruppe, benannt nach den Gruppen in sortierter Reihenfolge:

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

Ausgabe:

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

Kombiniere split() mit sapply(), um eine Zusammenfassung pro Gruppe zu berechnen:

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

Ausgabe:

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

Die Werte können auch Text sein, zum Beispiel, um Namen nach ihrem Anfangsbuchstaben zu gruppieren:

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

Ausgabe:

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

Eine Gruppe existiert nur, wenn ihr mindestens ein Wert zugeordnet ist. Prüfe daher mit %in% names(), bevor du eine Gruppe liest, die möglicherweise leer ist:

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

Ausgabe:

[1] FALSE
challenge icon

Aufgabe

Einfach

Vervollständige category_totals(amounts, categories). Gib eine Zeile pro Kategorie in alphabetischer Reihenfolge zurück, food: 40 (2 items), mit dem Gesamtbetrag und der Anzahl der Beträge in dieser Kategorie.

Der bereitgestellte Code liest die Beträge und die Kategorien als zwei durch Kommas getrennte Zeilen gleicher Länge ein und gibt jede zurückgegebene Zeile aus.

Probier es selbst

category_totals <- function(amounts, categories) {
  # Schreibe deinen Code hier
  character(0)
}

# Vorgegebener Eingabe-/Ausgabecode: Lass ihn unverändert
input <- suppressWarnings(readLines(file("stdin")))
cat(category_totals(as.numeric(strsplit(input[1], ",")[[1]]), strsplit(input[2], ",")[[1]]), sep = "\n")
quiz iconTeste dich selbst

Diese Lektion enthält ein kurzes Quiz. Starte die Lektion, um es zu beantworten und deinen Fortschritt zu speichern.

Alle Lektionen in Logik und Ablaufsteuerung

Übe selbstständig: Online-R-Compiler