Учебники

15) apply (), sapply (), tapply () в R

Этот урок направлен на ознакомление с коллекцией функций apply (). Функция apply () является самой базовой из всей коллекции. Мы также изучим sapply (), lapply () и tapply (). Применить коллекцию можно рассматривать как замену цикла.

В коллекцию apply () входит необходимый пакет r , если вы устанавливаете R вместе с Anaconda. Функция apply () может быть снабжена множеством функций для выполнения избыточного применения к коллекции объектов (фрейм данных, список, вектор и т. Д.). Цель apply () в первую очередь состоит в том, чтобы избежать явного использования конструкций цикла. Их можно использовать для ввода списка, матрицы или массива и применять функцию. Любая функция может быть передана в apply ().

В этом уроке вы узнаете

Эта функция принимает 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>

Простейшим примером является суммирование матрицы по всем столбцам. Применяемый код (m1, 2, sum) применяет функцию суммы к матрице 5×6 и возвращает сумму каждого столбца, доступного в наборе данных.

m1 <- matrix(C<-(1:10),nrow=5, ncol=6)
m1
a_m1 <- apply(m1, 2, sum)
a_m1

Вывод:

Рекомендация. Сохраните значения перед печатью на консоль.

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(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 () более эффективна, чем lapply () в возвращаемом выводе, потому что sapply () сохраняет значения direclty в векторе. В следующем примере мы увидим, что это не всегда так.

Мы можем суммировать разницу между apply (), sapply () и `lapply () в следующей таблице:

функция

аргументы

Задача

вход

Вывод

применять

применить (х, маржа, весело)

Применить функцию к строкам или столбцам или обоим

Фрейм данных или матрица

вектор, список, массив

lapply

радостно (X, весело)

Применить функцию ко всем элементам ввода

Список, вектор или фрейм данных

список

sapply

Саппи (X FUN)

Применить функцию ко всем элементам ввода

Список, вектор или фрейм данных

вектор или матрица

Срез вектор

Мы можем использовать lapply () или sapply () взаимозаменяемыми, чтобы разрезать фрейм данных. Мы создаем функцию ниже_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

Часть работы ученого или исследователя данных состоит в том, чтобы вычислять резюме переменных. Например, измерьте средние или групповые данные на основе характеристики. Большинство данных сгруппированы по идентификатору, городу, странам и т. Д. Подведение итогов по группе раскрывает более интересные закономерности.

Чтобы понять, как это работает, давайте использовать набор данных iris. Этот набор данных очень известен в мире машинного обучения. Цель этого набора данных — предсказать класс каждого из трех видов цветов: Sepal, Versicolor, Virginica. Набор данных собирает информацию для каждого вида об их длине и ширине.

В качестве предыдущей работы мы можем вычислить медиану длины для каждого вида. tapply () — это быстрый способ выполнить это вычисление.

data(iris)
tapply(iris$Sepal.Width, iris$Species, median)

Вывод:

##     setosa versicolor  virginica 
##        3.4        2.8        3.0