lapply и sapply
Часть раздела Логика и потоки выполнения путешествия по R на Coddy. Урок 32 из 64.
lapply(x, f) вызывает f для каждого элемента x и возвращает результаты в списке, по одному элементу на каждый входной элемент:
squares <- lapply(1:3, function(i) i^2)
print(length(squares))
print(squares[[3]])Вывод:
[1] 3
[1] 9sapply() делает то же самое и упрощает результат: когда каждый вызов возвращает одно значение, вы получаете обычный вектор вместо списка:
print(sapply(1:3, function(i) i^2))
print(sapply(c(4, 9, 16), sqrt))Результат:
[1] 1 4 9
[1] 2 3 4Для вектора символов sapply() задаёт результатам имена, соответствующие входным значениям. Добавьте USE.NAMES = FALSE, чтобы получить обычный вектор:
words <- c("tea", "coffee")
print(sapply(words, nchar))
print(sapply(words, nchar, USE.NAMES = FALSE))Результат:
tea coffee
3 6
[1] 3 6Эти функции заменяют цикл, который создаёт результат по одному элементу за раз. Обе приведённые ниже версии вычисляют, сколько гласных содержит каждое слово:
words <- c("banana", "sky", "idea")
vowels <- function(w) sum(strsplit(w, "")[[1]] %in% c("a", "e", "i", "o", "u"))
counts <- c()
for (w in words) counts <- c(counts, vowels(w))
print(counts)
print(sapply(words, vowels, USE.NAMES = FALSE))Вывод:
[1] 3 0 3
[1] 3 0 3Задание
ЛегкоЗавершите vowel_counts(words). Верните по одной строке на слово, banana: 3, с количеством гласных (a, e, i, o, u) в слове. Используйте sapply(), чтобы подсчитать гласные во всех словах.
Предоставленный код считывает слова в виде строки со словами в нижнем регистре, разделёнными запятыми, и выводит каждую возвращённую строку.
Попробуйте сами
vowel_counts <- function(words) {
# Напишите ваш код здесь
character(0)
}
# Предоставленный код ввода/вывода: оставьте его как есть
input <- suppressWarnings(readLines(file("stdin")))
cat(vowel_counts(strsplit(input[1], ",")[[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