Menu
CoddyTech

Mengelompokkan dengan split()

Termasuk bagian Logika dan Alur dalam perjalanan R di Coddy. Pelajaran 39 dari 64.

split(values, groups) menempatkan setiap nilai ke dalam grup yang namanya sesuai dengan elemen yang cocok di groups. Hasilnya adalah list dengan satu elemen untuk setiap grup, yang namanya mengikuti urutan terurut grup:

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

Output:

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

Gabungkan split() dengan sapply() untuk menghitung satu ringkasan per kelompok:

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

Output:

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

Nilainya juga bisa berupa teks, misalnya untuk mengelompokkan nama berdasarkan huruf pertamanya:

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

Output:

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

Sebuah grup hanya ada jika setidaknya ada satu nilai di dalamnya, jadi periksa dengan %in% names() sebelum membaca grup yang mungkin kosong:

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

Output:

[1] FALSE
challenge icon

Tantangan

Mudah

Lengkapi category_totals(amounts, categories). Kembalikan satu baris untuk setiap kategori dalam urutan alfabetis, food: 40 (2 items), dengan jumlah total dan banyaknya nilai dalam kategori tersebut.

Kode yang disediakan membaca jumlah dan kategori dari dua baris yang dipisahkan koma dengan panjang yang sama, lalu mencetak setiap baris yang dikembalikan.

Coba sendiri

category_totals <- function(amounts, categories) {
  # Tulis kodemu di sini
  character(0)
}

# Kode input/output yang disediakan: biarkan apa adanya
input <- suppressWarnings(readLines(file("stdin")))
cat(category_totals(as.numeric(strsplit(input[1], ",")[[1]]), strsplit(input[2], ",")[[1]]), sep = "\n")
quiz iconUji dirimu

Pelajaran ini berisi kuis singkat. Mulai pelajarannya untuk menjawab kuis dan melacak progresmu.

Semua pelajaran di Logika dan Alur

Latihan sendiri: Compiler R online