Menu
Coddy logo textTech

Итоги по группам

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

tapply(values, groups, f) группирует значения и применяет f к каждой группе за один вызов. Это даёт тот же результат, что и sapply(split(values, groups), f):

amounts <- c(10, 20, 30, 40)
category <- c("food", "rent", "food", "fun")
print(tapply(amounts, category, sum))
print(tapply(amounts, category, max))

Результат:

food  fun rent 
  40   40   20 
food  fun rent 
  30   40   20 

Результат получает имена по группам в отсортированном порядке, поэтому [[ ]] считывает одну группу, а names() перечисляет их:

amounts <- c(10, 20, 30, 40)
category <- c("food", "rent", "food", "fun")
avg <- tapply(amounts, category, mean)
print(avg[["food"]])
print(names(avg))

Вывод:

[1] 20
[1] "food" "fun"  "rent"

Функция суммирования может быть вашей собственной. Здесь она подсчитывает заказы на сумму больше 25 в каждой группе:

amounts <- c(10, 20, 30, 40)
category <- c("food", "rent", "food", "fun")
print(tapply(amounts, category, function(v) sum(v > 25)))

Вывод:

food  fun rent 
   1    1    0 

Результат представляет собой именованный вектор, поэтому sort() и which.max() находят самую большую группу. which.max() возвращает первое из равных значений:

amounts <- c(10, 20, 30, 40, 5)
category <- c("food", "rent", "food", "fun", "rent")
totals <- tapply(amounts, category, sum)
print(names(totals)[which.max(totals)])
print(names(sort(totals, decreasing = TRUE)))

Вывод:

[1] "food"
[1] "food" "fun"  "rent"
challenge icon

Задание

Легко

Дополните city_report(cities, temps). Верните по одной строке для каждого города в алфавитном порядке, например oslo: avg 4.5, max 9, со средней температурой, округлённой до одного десятичного знака, и максимальной температурой. Затем добавьте Warmest: , после чего укажите город с наибольшим средним значением (при совпадении средних — первый в алфавитном порядке).

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

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

city_report <- function(cities, temps) {
  # Напишите свой код здесь
  character(0)
}

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

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

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

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