Menu
Coddy logo textTech

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 entsprechenden 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 ebenfalls 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 mindestens ein Wert zu ihr gehört. Prüfe daher mit %in% names(), bevor du eine möglicherweise leere Gruppe liest:

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

# Mitgelieferter Ein-/Ausgabecode: belasse ihn wie er ist
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