R apply(), lapply(), sapply(), tapply() cu exemple

โšก Rezumat inteligent

apply(), lapply(), sapply() ศ™i tapply() formeazฤƒ familia de funcศ›ii R apply, o alternativฤƒ vectorizatฤƒ la buclele explicite care aplicฤƒ o funcศ›ie aleasฤƒ peste matrici, liste, vectori ศ™i date grupate pentru a returna rezultate concise.

  • ๐Ÿ”ฒ aplicฤƒ(): Ruleazฤƒ o funcศ›ie peste rรขnduri sau coloane ale unei matrice.
  • ๐Ÿ“‹ lapply(): Aplicฤƒ o funcศ›ie fiecฤƒrui element al listei, returneazฤƒ o listฤƒ.
  • ๐Ÿ“Š sฤƒptฤƒmรขnal(): Ca ศ™i lapply(), dar simplificฤƒ ieศ™irea รฎntr-un vector.
  • ๐Ÿ—‚๏ธ tapply(): Aplicฤƒ o funcศ›ie grupurilor definite de un factor.
  • ๐Ÿค– Asistenศ›ฤƒ AI: AI sugereazฤƒ aplicarea codului vectorizat peste bucle lente.

aplicฤƒ, suprapune, suprapune ศ™i atinge รฎn R

Acest tutorial are ca scop introducerea colecศ›iei de funcศ›ii apply(). Funcศ›ia apply() este cea mai elementarฤƒ dintre toate colecศ›iile. Vom รฎnvฤƒศ›a ศ™i sapply(), lapply() ศ™i tapply(). Colecศ›ia de aplicaศ›ii poate fi vฤƒzutฤƒ ca un substitut al buclei.

Colecศ›ia apply() este inclusฤƒ รฎn pachet r esential pachet dacฤƒ tu instalaศ›i R cu Anaconda. Funcศ›ia de aplicare รฎn R poate fi alimentatฤƒ cu multe funcศ›ii pentru a efectua aplicaศ›ii redundante pe o colecศ›ie de obiecte (cadru de date, listฤƒ, vector etc.). Scopul aplicaศ›iei() este รฎn primul rรขnd evitarea utilizฤƒrilor explicite ale constructelor bucle. Ele pot fi utilizate pentru o listฤƒ de intrare, o matrice sau o matrice ศ™i pot aplica o funcศ›ie. Orice funcศ›ie poate fi transmisฤƒ รฎn apply().

funcศ›ia apply().

aplica() ia cadru de date sau matrice ca intrare ศ™i oferฤƒ ieศ™ire รฎn vector, listฤƒ sau matrice. aplica funcศ›ia รฎn R este folosit รฎn primul rรขnd pentru a evita utilizฤƒrile explicite ale constructelor bucle. Este cea mai de bazฤƒ dintre toate colecศ›iile care pot fi folosite peste o matrice.

Aceastฤƒ funcศ›ie are 3 argumente:

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>

Cel mai simplu exemplu este sฤƒ รฎnsumฤƒm o matrice peste toate coloanele. Codul apply(m1, 2, sum) va aplica funcศ›ia sum matricei 5ร—6 ศ™i va returna suma fiecฤƒrei coloane accesibile รฎn setul de date.

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

ieศ™ire:

Exemplu de funcศ›ie Apply() รฎn R
exemplu de funcศ›ie apply() รฎn R

Cea mai bunฤƒ practicฤƒ: stocaศ›i valorile รฎnainte de a le imprima pe consolฤƒ.

funcศ›ia lapply().

laply() funcศ›ia este utilฤƒ pentru efectuarea de operaศ›ii pe obiecte listฤƒ ศ™i returneazฤƒ un obiect listฤƒ de aceeaศ™i lungime a setului original. lappy() returneazฤƒ o listฤƒ de lungime similarฤƒ ca obiectul listฤƒ de intrare, fiecare element al cฤƒruia este rezultatul aplicฤƒrii FUN la elementul corespondent al listei. Lapply รฎn R ia lista, vectorul sau cadru de date ca intrare ศ™i oferฤƒ rezultate รฎn listฤƒ.

lapply(X, FUN)
Arguments:
-X: A vector or an object
-FUN: Function applied to each element of x	

l รฎn lapply() รฎnseamnฤƒ listฤƒ. Diferenศ›a dintre lapply() ศ™i apply() constฤƒ รฎntre randamentul de ieศ™ire. Ieศ™irea lui lapply() este o listฤƒ. lapply() poate fi folosit pentru alte obiecte, cum ar fi cadre de date ศ™i liste.

Funcศ›ia lapply() nu are nevoie de MARGINฤ‚.

Un exemplu foarte uศ™or poate fi schimbarea valorii ศ™irului de caractere a unei matrice รฎn litere mici cu funcศ›ia de jos. Construim o matrice cu numele filmelor celebre. Numele este รฎn format majuscule.

movies <- c("SPYDERMAN","BATMAN","VERTIGO","CHINATOWN")
movies_lower <-lapply(movies, tolower)
str(movies_lower)

ieศ™ire:

## List of 4
## $:chr"spyderman"
## $:chr"batman"
## $:chr"vertigo"
## $:chr"chinatown"

Putem folosi unlist() pentru a converti lista รฎntr-un vector.

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

ieศ™ire:

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

funcศ›ia sapply().

sapply() funcศ›ia ia listฤƒ, vector sau cadru de date ca intrare ศ™i oferฤƒ ieศ™ire รฎn vector sau matrice. Este util pentru operaศ›iuni pe obiecte listฤƒ ศ™i returneazฤƒ un obiect listฤƒ de aceeaศ™i lungime a setului original. Funcศ›ia Sapply din R face aceeaศ™i treabฤƒ ca ศ™i funcศ›ia lapply(), dar returneazฤƒ un vector.

sapply(X, FUN)
Arguments:
-X: A vector or an object
-FUN: Function applied to each element of x

Putem mฤƒsura viteza minimฤƒ ศ™i ne putem opriping distanศ›ele maศ™inilor faศ›ฤƒ de setul de date privind maศ™inile.

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

ieศ™ire:

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

ieศ™ire:

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

ieศ™ire:

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

ieศ™ire:

## speed  dist 
##    25   120

Putem folosi o funcศ›ie รฎncorporatฤƒ de utilizator รฎn lapply() sau sapply(). Creฤƒm o funcศ›ie numitฤƒ avg pentru a calcula media minimului ศ™i maximului vectorului.

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

producศ›ie

## speed  dist
##  14.5  61.0

Sapply รฎn R este mai eficient decรขt lapply() รฎn rezultatul returnat deoarece sapply() stocheazฤƒ valorile direct รฎntr-un vector. รŽn exemplul urmฤƒtor, vom vedea cฤƒ nu este รฎntotdeauna cazul.

Putem rezuma diferenศ›a dintre apply(), sapply() ศ™i `lapply() รฎn urmฤƒtorul tabel:

Funcลฃie Argumente Obiectiv Intrare producศ›ie
aplica aplica (x, MARJA, DISTRACศšIE) Aplicaศ›i o funcศ›ie la rรขnduri sau coloane sau ambele Cadrul de date sau matricea vector, listฤƒ, matrice
laply laply (X, distracศ›ie) Aplicaศ›i o funcศ›ie tuturor elementelor de intrare Listฤƒ, vector sau cadru de date listฤƒ
sapply sapply (X, DISTRACศšIE) Aplicaศ›i o funcศ›ie tuturor elementelor de intrare Listฤƒ, vector sau cadru de date vector sau matrice

Vector felie

Putem folosi interschimbabil lapply() sau sapply() pentru a tฤƒia un cadru de date. Creฤƒm o funcศ›ie, below_average(), care preia un vector de valori numerice ศ™i returneazฤƒ un vector care conศ›ine doar valorile care sunt strict peste medie. Comparฤƒm ambele rezultate cu funcศ›ia 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)

ieศ™ire:

## [1] TRUE

funcศ›ia taply().

taply() calculeazฤƒ o mฤƒsurฤƒ (media, medianฤƒ, min, max etc..) sau o funcศ›ie pentru fiecare variabilฤƒ factor dintr-un vector. Este o funcศ›ie foarte utilฤƒ care vฤƒ permite sฤƒ creaศ›i un subset al unui vector ศ™i apoi sฤƒ aplicaศ›i unele funcศ›ii fiecฤƒrui subset.

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

O parte a sarcinii unui om de ศ™tiinศ›ฤƒ de date sau a cercetฤƒtorilor este de a calcula rezumate ale variabilelor. De exemplu, mฤƒsuraศ›i media sau datele de grup pe baza unei caracteristici. Majoritatea datelor sunt grupate dupฤƒ ID, oraศ™, ศ›ฤƒri ศ™i aศ™a mai departe. Rezumarea grupului dezvฤƒluie modele mai interesante.

Pentru a รฎnศ›elege cum funcศ›ioneazฤƒ, sฤƒ folosim setul de date iris. Acest set de date este foarte faimos รฎn lumea รฎnvฤƒศ›ฤƒrii automate. Scopul acestui set de date este de a prezice clasa fiecฤƒreia dintre cele trei specii de flori: Sepal, Versicolor, Virginica. Setul de date colecteazฤƒ informaศ›ii pentru fiecare specie despre lungimea ศ™i lฤƒศ›imea lor.

Ca o lucrare anterioarฤƒ, putem calcula mediana lungimii pentru fiecare specie. Taply รฎn R este o modalitate rapidฤƒ de a efectua acest calcul.

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

ieศ™ire:

##     setosa versicolor  virginica 
##        3.4        2.8        3.0

รŽntrebฤƒri frecvente

Funcศ›iile Apply nu sunt รฎntotdeauna mai rapide decรขt buclele for; principalul lor avantaj este codul concis ศ™i uศ™or de citit. Operaศ›iile vectorizate pe vectori รฎntregi sunt de obicei mai rapide decรขt ambele.

vapply() funcศ›ioneazฤƒ ca sapply(), dar impune un tip de returnare pentru siguranศ›ฤƒ, รฎn timp ce mapply() este o versiune multivariatฤƒ care aplicฤƒ o funcศ›ie mai multor vectori simultan.

Ambele aplicฤƒ o funcศ›ie fiecฤƒrui element al unei liste sau vector. lapply() returneazฤƒ รฎntotdeauna o listฤƒ, รฎn timp ce sapply() simplificฤƒ rezultatul รฎntr-un vector atunci cรขnd este posibil.

Da. Asistenศ›ii inteligenศ›i artificiali pot converti buclele รฎn apeluri apply sau sapply, pot sugera funcศ›ia potrivitฤƒ pentru datele dvs. ศ™i pot explica argumente precum MARGIN ศ™i FUN.

Instrumentele de inteligenศ›ฤƒ artificialฤƒ genereazฤƒ cod R, recomandฤƒ funcศ›ii de aplicare vectorizate, detecteazฤƒ erori ศ™i rezumฤƒ rezultatele, ajutรขndping analiศ™tii proceseazฤƒ cadrele de date mai rapid, cu mai puศ›ine erori.

Rezumaศ›i aceastฤƒ postare cu: