Menu
Coddy logo textTech

split() ile Gruplama

Coddy'nin R Journey'sinin Mantık ve Akış bölümünün bir parçası. Ders 39 / 64.

split(values, groups), her değeri groups içindeki eşleşen öğe tarafından adlandırılan gruba yerleştirir. Sonuç, sıralanmış düzende grupların adını taşıyan ve her grup için bir öğe içeren bir listedir:

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

Çıktı:

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

Grup başına bir özet hesaplamak için split() ile sapply() işlevlerini birleştirin:

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

Çıktı:

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

Değerler metin de olabilir; örneğin adları ilk harflerine göre gruplamak için:

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

Çıktı:

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

Bir grup, yalnızca en az bir değer ona ait olduğunda var olur; bu nedenle boş olabilecek bir grubu okumadan önce %in% names() ile kontrol edin:

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

Çıktı:

[1] FALSE
challenge icon

Görev

Kolay

category_totals(amounts, categories) işlevini tamamla. Kategoriler alfabetik sırada olacak şekilde her kategori için bir satır döndür: food: 40 (2 items); bu satırda toplam tutar ve o kategorideki tutarların sayısı yer almalıdır.

Sağlanan kod, tutarları ve kategorileri eşit uzunlukta, virgülle ayrılmış iki satır olarak okur ve döndürülen her satırı yazdırır.

Kendin dene

category_totals <- function(amounts, categories) {
  # Kodunuzu buraya yazın
  character(0)
}

# Sağlanan girdi/çıktı kodu: olduğu gibi bırakın
input <- suppressWarnings(readLines(file("stdin")))
cat(category_totals(as.numeric(strsplit(input[1], ",")[[1]]), strsplit(input[2], ",")[[1]]), sep = "\n")
quiz iconKendini test et

Bu ders kısa bir quiz içerir. Soruları yanıtlamak ve ilerlemeni kaydetmek için derse başla.

Mantık ve Akış bölümündeki tüm dersler

Kendi başına pratik yap: Online R derleyicisi