Apply(), lapply(), sapply(), tapply() Funkcja w R z przykładami

Celem tego samouczka jest przedstawienie kolekcji funkcji Apply(). Funkcja Apply() jest najbardziej podstawową ze wszystkich kolekcji. Nauczymy się także sapply(), lapply() i tapply(). Kolekcję Apply można postrzegać jako substytut pętli.

Kolekcja Apply() jest dołączona do niezbędne pakiet, jeśli zainstaluj R z Anacondą. Funkcja apply w R może być zasilana wieloma funkcjami w celu wykonania redundantnej aplikacji na zbiorze obiektów (ramka danych, lista, wektor itp.). Celem apply() jest przede wszystkim unikanie jawnego użycia konstrukcji pętli. Mogą być używane dla listy wejściowej, macierzy lub tablicy i stosować funkcję. Do apply() można przekazać dowolną funkcję.

zastosuj() funkcję

zastosować() pobiera ramkę danych lub macierz jako dane wejściowe i podaje dane wyjściowe w postaci wektora, listy lub tablicy. Stosować funkcja w R jest używany głównie w celu uniknięcia jawnego użycia konstrukcji pętli. Jest to najbardziej podstawowa ze wszystkich kolekcji, które mogą być używane na macierzach.

Funkcja ta 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 zsumowanie macierzy po wszystkich kolumnach. Kod Apply(m1, 2, sum) zastosuje funkcję sumy 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)
m1
a_m1 <- apply(m1, 2, sum)
a_m1

Wyjście:

Przykład funkcji Apply() w R
przykład funkcji Apply() w R

Najlepsza praktyka: Zapisz wartości przed wydrukowaniem ich na konsoli.

funkcja lapply().

laplikuj() funkcja jest przydatna do wykonywania operacji na obiektach listy i zwraca obiekt listy o tej samej długości co oryginalny zestaw. lappy() zwraca listę o podobnej długości jak wejściowy obiekt listy, którego każdy element jest wynikiem zastosowania FUN do odpowiadającego elementu listy. Lapply w R przyjmuje listę, wektor lub ramkę danych jako dane wejściowe i zwraca 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 między lapply() i Apply() polega na zwróceniu wyniku wyjściowego. Wynikiem lapply() jest lista. lapply() może być używana do innych obiektów, takich jak ramki danych i listy.

Funkcja lapply() nie potrzebuje MARGINESU.

Bardzo prostym przykładem może być zmiana wartości ciągu macierzy na małe litery za pomocą funkcji tolower. Konstruujemy macierz z nazwami znanych filmów. Nazwa jest pisana wielkimi 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 przekonwertować listę na wektor.

movies_lower <-unlist(lapply(movies,tolower))
str(movies_lower)

Wyjście:

##  chr [1:4] "spyderman" "batman" "vertigo" "chinatown"

funkcja saply().

soczysty() funkcja pobiera listę, wektor lub ramkę danych jako dane wejściowe i podaje dane wyjściowe w postaci wektora lub matryca. Jest użyteczna do operacji na obiektach listy i zwraca obiekt listy o tej samej długości co oryginalny zestaw. Funkcja Sapply w R 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

Na podstawie zbioru danych samochodów możemy zmierzyć minimalną prędkość i drogę hamowania samochodów.

dt <- cars
lmn_cars <- lapply(dt, min)
smn_cars <- sapply(dt, min)
lmn_cars

Wyjście:

## $speed
## [1] 4
## $dist
## [1] 2
smn_cars

Wyjście:

## speed  dist 
##     4     2
lmxcars <- lapply(dt, max)
smxcars <- sapply(dt, max)
lmxcars

Wyjście:

## $speed
## [1] 25
## $dist
## [1] 120
smxcars

Wyjście:

## speed  dist 
##    25   120

Możemy użyć wbudowanej funkcji użytkownika w lapply() lub sapply(). Tworzymy funkcję o nazwie avg, aby obliczyć średnią wartości minimalnej i maksymalnej wektora.

avg <- function(x) {  
  ( min(x) + max(x) ) / 2}
fcars <- sapply(dt, avg)
fcars

Wydajność

## speed  dist
##  14.5  61.0

Sapply w R 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óżnicę pomiędzy apply(), sapply() i `lapply() możemy podsumować w poniższej tabeli:

Funkcjonować Argumenty Cel Wkład Wydajność
zastosować Apply(x, MARGINES, ZABAWA) Zastosuj funkcję do wierszy, kolumn lub obu Ramka danych lub macierz wektor, lista, tablica
laplikuj lapply(X, ZABAWA) Zastosuj funkcję do wszystkich elementów wejścia Lista, wektor lub ramka danych podstęp
soczysty sapply(X, ZABAWA) Zastosuj funkcję do wszystkich elementów wejścia Lista, wektor lub ramka danych wektor lub macierz

Kawałek wektora

Do dzielenia ramki danych możemy używać wymiennie lapply() lub sapply(). Tworzymy funkcję poniżej_average(), która pobiera wektor wartości liczbowych i zwraca wektor zawierający tylko wartości wyraźnie powyżej średniej. Obydwa wyniki porównujemy za pomocą funkcji identyczne().

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)

Wyjście:

## [1] TRUE

funkcja tapply().

dotknij() oblicza miarę (średnią, medianę, min., maks. itd.) lub funkcję dla każdej zmiennej czynnikowej w wektorze. Jest to bardzo przydatna funkcja, która pozwala utworzyć podzbiór wektora, a następnie zastosować pewne funkcje do każdego z podzbiorów.

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

Częścią pracy naukowca lub badacza danych jest obliczanie podsumowań zmiennych. Na przykład, zmierzenie średnich lub grupowych danych na podstawie charakterystyki. Większość danych jest pogrupowana według identyfikatora, miasta, krajów itd. Podsumowanie grup ujawnia bardziej interesujące wzorce.

Aby zrozumieć, jak to działa, skorzystajmy ze zbioru 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, Virginia. Zbiór danych gromadzi informacje o długości i szerokości każdego gatunku.

W ramach wcześniejszej pracy możemy obliczyć medianę długości dla każdego gatunku. Tapply w R to szybki sposób na wykonanie tego obliczenia.

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

Wyjście:

##     setosa versicolor  virginica 
##        3.4        2.8        3.0