Сводные данные по строкам и столбцам
Часть раздела Логика и потоки выполнения путешествия по R на Coddy. Урок 19 из 64.
rowSums() и rowMeans() возвращают по одному результату для каждой строки; colSums() и colMeans() — по одному для каждого столбца. Здесь каждая строка — это ученик, а каждый столбец — тест:
scores <- matrix(c(80, 90, 70, 60, 75, 85), nrow = 2, byrow = TRUE)
print(rowMeans(scores))
print(colSums(scores))Результат:
[1] 80.00000 73.33333
[1] 140 165 155Для любого другого сводного вычисления apply(m, 1, f) вызывает f для каждой строки, а apply(m, 2, f) — для каждого столбца:
scores <- matrix(c(80, 90, 70, 60, 75, 85), nrow = 2, byrow = TRUE)
print(apply(scores, 1, max))
print(apply(scores, 2, min))Результат:
[1] 90 85
[1] 60 75 70Объедините сводку с which.max(), чтобы определить, какая строка или столбец побеждает:
scores <- matrix(c(80, 90, 70, 60, 75, 85), nrow = 2, byrow = TRUE)
best_test <- which.max(colMeans(scores))
print(best_test)
print(round(rowMeans(scores), 1))Вывод:
[1] 2
[1] 80.0 73.3apply() также принимает функцию, которую вы пишете прямо на месте, с помощью function(r). Здесь она подсчитывает значения больше 5 в каждой строке:
m <- matrix(c(3, 8, 1, 9, 2, 7), nrow = 2, byrow = TRUE)
print(apply(m, 1, function(r) sum(r > 5)))Результат:
[1] 1 2Задание
ЛегкоЗавершите class_report(scores). Каждая строка scores представляет собой студента, а каждый столбец — тест. Верните по одной строке для каждого студента, например Student 1: 81.7, со средним значением студента, округлённым до одного знака после запятой. Добавьте последнюю строку Best test: , за которой следует номер столбца с наибольшим средним значением.
Предоставленный код считывает матрицу из одной строки: строки разделяются с помощью ;, а значения строки — с помощью ,, поэтому 1,2;3,4 представляет собой матрицу со строками 1 2 и 3 4. Код выводит каждую возвращённую строку.
Попробуйте сами
class_report <- function(scores) {
# Напишите свой код здесь
character(0)
}
# Предоставленный код ввода/вывода: оставьте его как есть
input <- suppressWarnings(readLines(file("stdin")))
parse_matrix <- function(line) {
rows <- strsplit(line, ";")[[1]]
matrix(as.numeric(unlist(strsplit(rows, ","))), nrow = length(rows), byrow = TRUE)
}
cat(class_report(parse_matrix(input[1])), sep = "\n")
В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.
Все уроки раздела Логика и потоки выполнения
1Строки углублённо
Подстроки с substr()Форматирование с sprintf()Разделение и объединениеПоиск в строкахЗамена текстаПовторение — создание имени пользователя4Матрицы
Создание матрицИндексация матрицСводные данные по строкам и столбцамАрифметика матрицПовторение — схема рассадки7Семейство Apply
lapply и sapplyMap и mapplyFilter и FindReduceПовторение — конвейер обработки данных10Продвинутые конструкции управления
Функция switch()Векторизованный ifelse()repeat и breakРекурсивные функцииПовторение — классификатор оценок2Поиск по ключам и значениям
Поиск в именованных векторахПроверка ключейДобавление и удаление ключейПеребор имёнПовторение — биржа акций5Проект — Журнал оценок
Добавление учениковВыставление оценок3Множества и подсчёт
Уникальные значенияОперации с множествамиПроверка принадлежностиПодсчёт с помощью table()Повторение — гости мероприятия6Функции как значения
Анонимные функцииПередача функцийВозврат функцийЗамыкания с состояниемПовторение — правила скидок9Таблицы данных
Создание таблиц данныхСтолбцы и строкиФильтрация строкДобавление и сортировкаПовторение — отчёт о продажах12Проект — Трекер расходов
Запись расходовОбщие расходыПотренируйтесь самостоятельно: Онлайн-компилятор R