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 30Kombiniere 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] FALSEAufgabe
EinfachVervollstä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")
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
1Strings im Detail
Teilstrings mit substr()Formatierung mit sprintf()Aufteilen und VerbindenStrings durchsuchenText ersetzenWiederholung – Benutzernamen-Generator4Matrizen
Matrizen erstellenMatrizen indizierenZusammenfassungen von Zeilen und SpaltenMatrizenarithmetikRückblick – Sitzplan10Fortgeschrittener Kontrollfluss
Die switch()-FunktionVektorisierter ifelse()repeat und breakRekursive FunktionenRückblick – Notenklassifizierung2Schlüssel-Wert-Suchen
Benannte Vektor-SuchenSchlüssel prüfenSchlüssel hinzufügen und entfernenNamen durchlaufenRückblick – Aktienübersicht5Projekt – Notenbuch
Schüler hinzufügenNoten eintragen8Sortieren und Gruppieren
Vektoren sortierenNach einem Schlüssel sortierenGruppieren mit split()GruppenzusammenfassungenRückblick – Rangliste3Mengen und Zählen
Eindeutige WerteMengenoperationenZugehörigkeitstestsZählen mit table()Rückblick – Gäste einer Veranstaltung6Funktionen als Werte
Anonyme FunktionenFunktionen übergebenFunktionen zurückgebenClosures mit ZustandRückblick – Rabattregeln9Datenrahmen
Datenrahmen erstellenSpalten und ZeilenZeilen filternHinzufügen und SortierenZusammenfassung – Verkaufsbericht12Projekt – Ausgaben-Tracker
Ausgaben erfassenGesamtausgabenÜbe selbstständig: Online-R-Compiler