Tutorial ten ma na celu przybliżenie zbioru funkcji apply(). Funkcja apply() jest najbardziej podstawową ze wszystkich kolekcji. Poznamy również funkcje sapply(), lapply() oraz tapply(). Kolekcję apply można traktować jako zamiennik pętli.
Kolekcja apply() jest dołączona do pakietu r essential, jeśli instalujesz R z Anacondą. Funkcja apply() może być zasilana wieloma funkcjami w celu wykonania nadmiarowej aplikacji na kolekcji obiektów (ramka danych, lista, wektor, itp.). Celem funkcji apply() jest przede wszystkim uniknięcie jawnego użycia konstrukcji pętli. Można je zastosować do wejściowej listy, macierzy lub tablicy i zastosować funkcję. Dowolna funkcja może być przekazana do apply().
W tym tutorialu, nauczysz się
- funkcji apply()
- funkcji lapply( )
- funkcji sapply()
- funkcji slice vector
- funkcji tapply()
- funkcji sapply() tapply() function
funkcja apply() function
apply() przyjmuje ramkę danych lub macierz jako dane wejściowe i podaje dane wyjściowe w postaci wektora, listę lub tablicę. Funkcja apply() jest używana głównie w celu uniknięcia jawnego użycia konstrukcji pętli. Jest to najbardziej podstawowa z wszystkich kolekcji, która może być użyta nad macierzą.
Funkcja przyjmuje 3 argumenty:
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>
Najprostszym przykładem jest sumowanie matrioszki po wszystkich kolumnach. Kod apply(m1, 2, suma) zastosuje funkcję suma do macierzy 5×6 i zwróci sumę każdej kolumny dostępnej w zbiorze danych.
m1 <- matrix(C<-(1:10),nrow=5, ncol=6)m1a_m1 <- apply(m1, 2, sum)a_m1
Wyjście:
Najlepsza praktyka: Przechowuj wartości przed wydrukowaniem go do konsoli.
funkcja lapply()
funkcja lapply() jest przydatna do wykonywania operacji na obiektach listy i zwraca obiekt listy o tej samej długości co oryginalny zbiór. lappy() zwraca listę o podobnej długości jak wejściowy obiekt listy, której każdy element jest wynikiem zastosowania FUN do odpowiedniego elementu listy. lapply() przyjmuje listę, wektor lub ramkę danych jako dane wejściowe i podaje dane wyjściowe w postaci listy.
lapply(X, FUN)Arguments:-X: A vector or an object-FUN: Function applied to each element of x
l w lapply() oznacza listę. Różnica pomiędzy lapply() a apply() leży pomiędzy zwracanym wyjściem. Wyjściem funkcji lapply() jest lista. lapply() może być używane do innych obiektów, takich jak ramki danych i listy.
funkcja lapply() nie potrzebuje MARGIN.
Bardzo prostym przykładem może być zmiana wartości łańcucha w macierzy na małe litery za pomocą funkcji tolower. Konstruujemy macierz z nazwami znanych filmów. Nazwa jest zapisana dużymi literami.
movies <- c("SPYDERMAN","BATMAN","VERTIGO","CHINATOWN")movies_lower <-lapply(movies, tolower)str(movies_lower)
Wyjście:
## List of 4## $:chr"spyderman"## $:chr"batman"## $:chr"vertigo"## $:chr"chinatown"
Możemy użyć funkcji unlist(), aby przekształcić listę w wektor.
movies_lower <-unlist(lapply(movies,tolower))str(movies_lower)
Wyjście:
## chr "spyderman" "batman" "vertigo" "chinatown"
funkcja sapply()
Funkcja sapply() przyjmuje jako dane wejściowe listę, wektor lub ramkę danych i daje dane wyjściowe w postaci wektora lub macierzy. Jest ona przydatna do operacji na obiektach listy i zwraca obiekt listy o tej samej długości co oryginalny zestaw. Funkcja sapply() wykonuje to samo zadanie co funkcja lapply(), ale zwraca wektor.
sapply(X, FUN)Arguments:-X: A vector or an object-FUN: Function applied to each element of x
Możemy zmierzyć minimalną prędkość i drogę zatrzymania samochodów z zestawu danych cars.
dt <- carslmn_cars <- lapply(dt, min)smn_cars <- sapply(dt, min)lmn_cars
Wyjście:
## $speed## 4## $dist## 2
smn_cars
Output:
## speed dist ## 4 2
lmxcars <- lapply(dt, max)smxcars <- sapply(dt, max)lmxcars
Wykonawca:
## $speed## 25## $dist## 120
smxcars
Wyjście:
## speed dist ## 25 120
Możemy użyć funkcji wbudowanej przez użytkownika w lapply() lub sapply(). Tworzymy funkcję o nazwie avg, aby obliczyć średnią z minimum i maksimum wektora.
avg <- function(x) { ( min(x) + max(x) ) / 2}fcars <- sapply(dt, avg)fcars
Wyjście
## speed dist## 14.5 61.0
Funkcja sapply() jest bardziej wydajna niż lapply() w zwracanych danych wyjściowych, ponieważ sapply() przechowuje wartości bezpośrednio w wektorze. W następnym przykładzie zobaczymy, że nie zawsze tak jest.
Różnice pomiędzy apply(), sapply() i `lapply() możemy podsumować w poniższej tabeli:
Funkcja |
Argumenty |
Cel. |
Wejście |
Wyjście |
|
---|---|---|---|---|---|
zastosuj |
zastosuj(x, MARGIN, FUN) |
Zastosuj funkcję do wierszy lub kolumn lub obu |
Ramka danych lub macierz |
wektor, lista, tablica |
|
apply |
lapply(X, FUN) |
Zastosuj funkcję do wszystkich elementów danych wejściowych |
List, wektor lub ramka danych |
list |
|
sappy |
sappy(X FUN) |
Zastosuj funkcję do wszystkich elementów danych wejściowych |
List, wektor lub ramka danych |
wektor lub macierz |
Pokrój wektor
Możemy używać zamiennie lapply() lub sapply() do pokrojenia ramki danych. Tworzymy funkcję below_average(), która pobiera wektor wartości liczbowych i zwraca wektor, który zawiera tylko te wartości, które są ściśle powyżej średniej. Porównujemy oba wyniki z funkcją identical().
below_ave <- function(x) { ave <- mean(x) return(x)}dt_s<- sapply(dt, below_ave)dt_l<- lapply(dt, below_ave)identical(dt_s, dt_l)
Wyjście:
## TRUE
funkcja tapply()
tapply() oblicza miarę (średnią, medianę, min, max, itd…) lub funkcję dla każdej zmiennej czynnikowej w wektorze. Jest to bardzo przydatna funkcja, która pozwala na stworzenie podzbioru wektora, a następnie zastosowanie pewnych funkcji do każdego z tych podzbiorów.
Częścią pracy naukowca danych lub badaczy jest obliczanie podsumowań zmiennych. Na przykład zmierzyć średnią lub pogrupować dane na podstawie cechy. Większość danych jest pogrupowana według ID, miasta, krajów i tak dalej. Podsumowanie nad grupą ujawnia więcej interesujących wzorców.
Aby zrozumieć, jak to działa, użyjmy zestawu danych tęczówki. Ten zbiór danych jest bardzo znany w świecie uczenia maszynowego. Celem tego zbioru danych jest przewidzenie klasy każdego z trzech gatunków kwiatów: Sepal, Versicolor, Virginica. Zestaw danych zbiera dla każdego gatunku informacje o ich długości i szerokości.
Jako wstęp do pracy, możemy obliczyć medianę długości dla każdego gatunku. tapply() jest szybkim sposobem na wykonanie tego obliczenia.
data(iris)tapply(iris$Sepal.Width, iris$Species, median)
Output:
## setosa versicolor virginica ## 3.4 2.8 3.0