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

Вывод:

Пример функции Apply() в R
Пример функции apply() в R

Лучшая практика: сохраните значения перед выводом их на консоль.

функция 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