apply(), lapply(), sapply(), tapply() Функція в R із прикладами
Цей підручник спрямований на ознайомлення з колекцією функцій apply(). Функція apply() є найпростішою з усіх колекцій. Ми також вивчимо sapply(), lapply() і tapply(). Збірку застосування можна розглядати як заміну циклу.
Колекція apply() входить у комплект r необхідний пакет, якщо ви встановити R з Anaconda. Функція застосування в R може бути надана багатьма функціями для виконання надлишкового застосування до колекції об’єктів (кадр даних, список, вектор тощо). Метою apply() є насамперед уникнення явного використання конструкцій циклу. Їх можна використовувати для вхідного списку, матриці або масиву та застосувати функцію. Будь-яку функцію можна передати в 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) застосує функцію sum до матриці 5×6 і поверне суму кожного стовпця, доступного в наборі даних.
m1 <- matrix(C<-(1:10),nrow=5, ncol=6) m1 a_m1 <- apply(m1, 2, sum) a_m1
вихід:
Найкраща практика: збережіть значення перед друком на консолі.
функція lapply().
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().
sapply() функція приймає список, вектор або кадр даних як вхідні дані та видає вихід у векторі або матриця. Це корисно для операцій над об’єктами списку та повертає об’єкт списку такої самої довжини вихідного набору. Функція 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) | Застосуйте функцію до рядків або стовпців або до обох | Кадр даних або матриця | вектор, список, масив |
lapply | lapply(X, FUN) | Застосувати функцію до всіх елементів введення | Список, вектор або кадр даних | список |
насичений | sapply(X, FUN) | Застосувати функцію до всіх елементів введення | Список, вектор або кадр даних | вектор або матриця |
Фрагмент вектор
Ми можемо використовувати lapply() або sapply() як взаємозамінні для розділення кадру даних. Ми створюємо функцію below_average(), яка приймає вектор числових значень і повертає вектор, який містить лише значення, які строго перевищують середнє. Ми порівнюємо обидва результати за допомогою функції identical().
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().
apply() обчислює міру (середнє, медіана, мінімум, максимум тощо) або функцію для кожної факторної змінної у векторі. Це дуже корисна функція, яка дозволяє створити підмножину вектора, а потім застосувати деякі функції до кожної підмножини.
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
Частиною роботи спеціаліста з даних або дослідників є обчислення підсумків змінних. Наприклад, виміряйте середнє або групові дані на основі характеристики. Більшість даних згруповано за ID, містом, країнами тощо. Підведення підсумків по групі виявляє більш цікаві закономірності.
Щоб зрозуміти, як це працює, скористаємося набором даних райдужної оболонки ока. Цей набір даних дуже відомий у світі машинного навчання. Метою цього набору даних є прогнозування класу кожного з трьох видів квітів: чашолистка, Versicolor, Virginica. Набір даних збирає інформацію про довжину та ширину кожного виду.
В якості попередньої роботи ми можемо обчислити медіану довжини для кожного виду. Tapply в R — це швидкий спосіб виконати це обчислення.
data(iris) tapply(iris$Sepal.Width, iris$Species, median)
вихід:
## setosa versicolor virginica ## 3.4 2.8 3.0