apply(), lapply(), sapply(), Tapply() Функция в R с примерами
Целью этого руководства является знакомство с коллекцией функций apply(). Функция apply() — самая простая из всех коллекций. Мы также изучим sapply(), lapply() и Tapply(). Коллекцию apply можно рассматривать как замену цикла.
Коллекция apply() поставляется в комплекте с очень важно пакет, если ты установить R с Анакондой. Функция Apply в R может быть дополнена множеством функций для выполнения избыточного применения к коллекции объектов (фрейм данных, список, вектор и т. д.). Цель применения() — в первую очередь избежать явного использования конструкций цикла. Их можно использовать для входного списка, матрицы или массива и применять функцию. Любую функцию можно передать в apply().
apply () функция
применять() принимает кадр данных или матрицу в качестве входных данных и выдает выходные данные в виде вектора, списка или массива. Применять функция в R в основном используется для того, чтобы избежать явного использования конструкций цикла. Это самая простая из всех коллекций, которую можно использовать поверх матриц.
Эта функция принимает 3 аргумента:
apply(X, MARGIN, FUN) Here: -x: an array or matrix -MARGIN: take a value or range between 1 and 2 to define where to apply the function: -MARGIN=1`: the manipulation is performed on rows -MARGIN=2`: the manipulation is performed on columns -MARGIN=c(1,2)` the manipulation is performed on rows and columns -FUN: tells which function to apply. Built functions like mean, median, sum, min, max and even user-defined functions can be applied>
Самый простой пример — суммирование матрицы по всем столбцам. Код apply(m1, 2, sum) применит функцию суммы к матрице 5×6 и вернет сумму каждого столбца, доступного в наборе данных.
m1 <- matrix(C<-(1:10),nrow=5, ncol=6) m1 a_m1 <- apply(m1, 2, sum) a_m1
Вывод:
Лучшая практика: сохраните значения перед выводом их на консоль.
функция lapply()
лапли() Функция полезна для выполнения операций над объектами списка и возвращает объект списка той же длины, что и исходный набор. lappy() возвращает список той же длины, что и объект входного списка, каждый элемент которого является результатом применения FUN к соответствующему элементу списка. Lapply в R принимает список, вектор или фрейм данных в качестве входных данных и выдает выходные данные в виде списка.
lapply(X, FUN) Arguments: -X: A vector or an object -FUN: Function applied to each element of x
l в lapply() означает список. Разница между lapply() и apply() заключается в возврате вывода. Результатом работы lapply() является список. lapply() можно использовать для других объектов, таких как фреймы данных и списки.
Для функции lapply() не требуется MARGIN.
Очень простым примером может быть изменение строкового значения матрицы на нижний регистр с помощью функции tolower. Построим матрицу с названиями известных фильмов. Имя указывается в верхнем регистре.
movies <- c("SPYDERMAN","BATMAN","VERTIGO","CHINATOWN") movies_lower <-lapply(movies, tolower) str(movies_lower)
Вывод:
## List of 4 ## $:chr"spyderman" ## $:chr"batman" ## $:chr"vertigo" ## $:chr"chinatown"
Мы можем использовать unlist() для преобразования списка в вектор.
movies_lower <-unlist(lapply(movies,tolower)) str(movies_lower)
Вывод:
## chr [1:4] "spyderman" "batman" "vertigo" "chinatown"
функция саппли()
сочный () функция принимает список, вектор или фрейм данных в качестве входных данных и выдает выходные данные в векторном или матрица. Это полезно для операций с объектами списка и возвращает объект списка той же длины, что и исходный набор. Функция Sapply в R выполняет ту же работу, что и функция lapply(), но возвращает вектор.
sapply(X, FUN) Arguments: -X: A vector or an object -FUN: Function applied to each element of x
Мы можем измерить минимальную скорость и тормозной путь автомобилей из набора данных автомобилей.
dt <- cars lmn_cars <- lapply(dt, min) smn_cars <- sapply(dt, min) lmn_cars
Вывод:
## $speed ## [1] 4 ## $dist ## [1] 2
smn_cars
Вывод:
## speed dist ## 4 2
lmxcars <- lapply(dt, max) smxcars <- sapply(dt, max) lmxcars
Вывод:
## $speed ## [1] 25 ## $dist ## [1] 120
smxcars
Вывод:
## speed dist ## 25 120
Мы можем использовать встроенную функцию пользователя в lapply() или sapply(). Мы создаем функцию с именем avg для вычисления среднего значения минимума и максимума вектора.
avg <- function(x) { ( min(x) + max(x) ) / 2} fcars <- sapply(dt, avg) fcars
Результат
## speed dist ## 14.5 61.0
Sapply в R более эффективен, чем lapply(), в возвращаемом выводе, поскольку sapply() сохраняет значения непосредственно в вектор. В следующем примере мы увидим, что это не всегда так.
Мы можем суммировать разницу между apply(), sapply() и `lapply() в следующей таблице:
Функция | аргументы | Цель | вход | Результат |
---|---|---|---|---|
подать | применить(x, MARGIN, FUN) | Применить функцию к строкам или столбцам или к тому и другому | Кадр данных или матрица | вектор, список, массив |
прихотливый | лаппли(X, ВЕСЕЛО) | Применить функцию ко всем элементам ввода | Список, вектор или фрейм данных | список |
сочный | саппли(X, FUN) | Применить функцию ко всем элементам ввода | Список, вектор или фрейм данных | вектор или матрица |
Вектор среза
Мы можем использовать взаимозаменяемые функции lapply() или sapply() для разрезания кадра данных. Мы создаем функцию Below_average(), которая принимает вектор числовых значений и возвращает вектор, содержащий только значения, строго превышающие среднее значение. Мы сравниваем оба результата с одной и той же функцией идентичных().
below_ave <- function(x) { ave <- mean(x) return(x[x > ave]) } dt_s<- sapply(dt, below_ave) dt_l<- lapply(dt, below_ave) identical(dt_s, dt_l)
Вывод:
## [1] TRUE
функция таппли()
таппли() вычисляет меру (среднее, медиану, минимум, максимум и т. д.) или функцию для каждой факторной переменной в векторе. Это очень полезная функция, которая позволяет создать подмножество вектора, а затем применить некоторые функции к каждому из подмножеств.
tapply(X, INDEX, FUN = NULL) Arguments: -X: An object, usually a vector -INDEX: A list containing factor -FUN: Function applied to each element of x
Часть работы специалиста по обработке данных или исследователей заключается в вычислении сводных данных переменных. Например, измерьте средние или групповые данные на основе характеристики. Большая часть данных сгруппирована по идентификатору, городу, стране и так далее. Подведение итогов по группе выявляет более интересные закономерности.
Чтобы понять, как это работает, давайте воспользуемся набором данных радужной оболочки глаза. Этот набор данных очень известен в мире машинного обучения. Цель этого набора данных — предсказать класс каждого из трех видов цветков: чашелистик, лишай, вирджиния. Набор данных собирает информацию для каждого вида об их длине и ширине.
В качестве предварительной работы мы можем вычислить медиану длины для каждого вида. Tapply в R — это быстрый способ выполнить эти вычисления.
data(iris) tapply(iris$Sepal.Width, iris$Species, median)
Вывод:
## setosa versicolor virginica ## 3.4 2.8 3.0