Menu
Coddy logo textTech

Группировка с помощью split()

Часть раздела Логика и потоки выполнения путешествия по R на Coddy. Урок 39 из 64.

split(values, groups) помещает каждое значение в группу, названную соответствующим элементом groups. Результатом является список с одним элементом на группу; элементы названы в соответствии с группами, отсортированными по порядку:

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

Вывод:

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

Объедините split() с sapply(), чтобы вычислить одну сводку для каждой группы:

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

Результат:

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

Значениями также может быть текст, например, чтобы сгруппировать имена по их первой букве:

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

Результат:

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

Группа существует только тогда, когда ей принадлежит хотя бы одно значение, поэтому перед чтением группы, которая может быть пустой, проверьте с помощью %in% names():

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

Вывод:

[1] FALSE
challenge icon

Задание

Легко

Завершите category_totals(amounts, categories). Верните по одной строке для каждой категории в алфавитном порядке, food: 40 (2 items), с общей суммой и количеством значений в этой категории.

Предоставленный код считывает суммы и категории как две разделённые запятыми строки одинаковой длины и выводит каждую возвращённую строку.

Попробуйте сами

category_totals <- function(amounts, categories) {
  # Напишите ваш код здесь
  character(0)
}

# Предоставленный код ввода/вывода: оставьте его как есть
input <- suppressWarnings(readLines(file("stdin")))
cat(category_totals(as.numeric(strsplit(input[1], ",")[[1]]), strsplit(input[2], ",")[[1]]), sep = "\n")
quiz iconПроверьте себя

В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.

Все уроки раздела Логика и потоки выполнения

Потренируйтесь самостоятельно: Онлайн-компилятор R