Итоги по группам
Часть раздела Логика и потоки выполнения путешествия по 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"Задание
ЛегкоДополните 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")
В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.
Все уроки раздела Логика и потоки выполнения
1Строки углублённо
Подстроки с substr()Форматирование с sprintf()Разделение и объединениеПоиск в строкахЗамена текстаПовторение — создание имени пользователя4Матрицы
Создание матрицИндексация матрицСводные данные по строкам и столбцамАрифметика матрицПовторение — схема рассадки7Семейство Apply
lapply и sapplyMap и mapplyFilter и FindReduceПовторение — конвейер обработки данных10Продвинутые конструкции управления
Функция switch()Векторизованный ifelse()repeat и breakРекурсивные функцииПовторение — классификатор оценок2Поиск по ключам и значениям
Поиск в именованных векторахПроверка ключейДобавление и удаление ключейПеребор имёнПовторение — биржа акций5Проект — Журнал оценок
Добавление учениковВыставление оценок8Сортировка и группировка
Сортировка векторовСортировка по ключуГруппировка с помощью split()Итоги по группамПовторение — таблица лидеров3Множества и подсчёт
Уникальные значенияОперации с множествамиПроверка принадлежностиПодсчёт с помощью table()Повторение — гости мероприятия6Функции как значения
Анонимные функцииПередача функцийВозврат функцийЗамыкания с состояниемПовторение — правила скидок9Таблицы данных
Создание таблиц данныхСтолбцы и строкиФильтрация строкДобавление и сортировкаПовторение — отчёт о продажах12Проект — Трекер расходов
Запись расходовОбщие расходыПотренируйтесь самостоятельно: Онлайн-компилятор R