Aplicacions Web

Entendre les funcions apply(), lapply(), sapply(), tapply() a R amb exemples

30 d'octubre de 2021

Un dels llenguatges de programació àmpliament utilitzats per a la computació estadística i el desenvolupament de programari estadístic a R. Llenguatge de programació R té llicència sota la Llicència Pública General de GNU. Té tots els programes per manejar interfícies, anomenats interfície de línia d'ordres . A més, el llenguatge de programació R està integrat amb altres interfícies gràfiques d'usuari, com ara RStudio , Júpyter quadern. Aprendràs algunes funcions significatives de R, com apply(), tapply(), lapply() i sapply() en aquest article.

Taula de continguts

Què és el llenguatge de programació R?

L'any 1993, va néixer el llenguatge de programació anomenat R. Ross Ihaka i Robert Gentleman van dissenyar el llenguatge de programació R. El llenguatge de programació R és la versió moderna del llenguatge de programació S. El Llenguatge de programació S també es va desenvolupar per a la computació estadística. El nom R es dóna al llenguatge de programació basat en els noms de Ross i Robert.

Com que el llenguatge de programació R està especialment dissenyat per a estadístiques i gràfics, incorpora diversos mètodes estadístics i gràfics. Aquests mètodes inclouen classificació, agrupació, modelització lineal, modelització no lineal i moltes altres tècniques. L'avantatge important del llenguatge de programació R és que té orientat a objectes instal·lacions que altres llenguatges de programació estadístic.

Feu-nos saber com s'executa el programa en el llenguatge de programació R. Té un indicador d'ordres R que executa qualsevol codi o una línia de codi. Suposem que un usuari ha de calcular 2+2 a l'indicador d'ordres R. Mostrarà el resultat 4, tal com es mostra a continuació:

|_+_|

Aquí, cada element es tracta com un únic vector. Per tant, 2+2 implica dos vectors diferents, cadascun amb 2 com a valor. Mirant la sortida, mostra [1] abans de la sortida real, 4. [1] representa el nombre d'elements en un vector.

Estructures de dades a R

El llenguatge de programació R també admet l'ús de matrius. Admet estructures de dades, com ara matrius , matrius, vectors, llistes , i marcs de dades.

sapply
    Matriu:

L'estructura de dades de matriu en el llenguatge de programació R conté dades de tipus similars. Emmagatzema dades en més de dues dimensions. Per exemple, si definim una matriu (3,5,4), crea 4 matrius, on cada matriu tindrà 3 files i 5 columnes. Podeu crear una matriu en llenguatge de programació R mitjançant el mètode array().

La funció array() produeix una matriu, que es considera un vector. La sintaxi de la funció array() a R es mostra a continuació:

|_+_|

Aquí, nrow significa el nombre de files, ncol implica el nombre de columnes i nmat significa el nombre de matrius.

Vegem l'exemple de creació d'una matriu en R. El codi següent crea una matriu 3*3.

|_+_|

Sortida:

|_+_|
[ , 1][ , 2][ , 3]
[ , 1]312
[ , 2]649
[ , 3]758
|_+_|
[ , 1][ , 2][ , 3]
[ , 1]312
[ , 2]649
[ , 3]758
    Matrius:

En el llenguatge de programació R, l'estructura de dades de la matriu representa les dades en forma d'una forma rectangular bidimensional. Tots els elements presents a la matriu són del mateix tipus de dades. Igual que el mètode array() s'utilitza per crear una matriu, la funció matrix() s'utilitza per crear una matriu.

La matriu s'utilitza habitualment per a càlculs matemàtics. Tanmateix, també pot prendre valors de caràcters així com valors lògics. Però, generalment, aquests valors no s'utilitzen àmpliament a les matrius. La sintaxi de la funció matrix() a R es dóna de la següent manera:

|_+_|

Aquí, les dades es tracten com un vector, que consta d'elements matricials. L'altre argument, nrow, implica el nombre de files, i ncol significa el nombre de columnes. L'últim argument, dimnames, representa els noms de files i columnes. L'argument únic de la matriu() és la byrow, que és un valor lògic. Si la fila és TRUE, tots els elements vectorials es representen en un format de fila.

A continuació es mostra l'exemple que us ajudarà a implementar matrius.

|_+_|

Sortida:

[ , 1][ , 2][ , 3]
[ , 1]456
[ , 2]789
[ , 3]101112
[ , 1][ , 2][ , 3]
[ , 1]4710
[ , 2]5811
[ , 3]6912
col1col2col3
fila 1456
fila 2789
fila 3101112
    Vectors:

Un vector és una estructura de dades molt fonamental en el llenguatge de programació R. Admet sis valors de tipus de dades diferents, com ara enter, doble, complex, caràcter, brut i lògic. A l'estructura de dades vectorials, podeu incloure un sol element de diversos elements. Vegem exemples d'elements únics i múltiples en un vector.

Vegeu també 23 millors llocs web gratuïts per compartir fitxers

Element únic:

|_+_|

Elements múltiples:

|_+_|
    Llista:

Una estructura de dades de llista pot contenir qualsevol tipus de dades, com ara nombres enters, cadenes, vectors, etc. És possible tenir una llista dins d'una llista. Una característica sorprenent d'una estructura de dades de llista és que també pot tenir una matriu o qualsevol funció al seu interior. Creem una llista en el llenguatge de programació R mitjançant la funció list().

La següent és la sintaxi de la llista en R:

|_+_|

Aquí, x és un objecte de la llista i el valor representa elements de l'objecte x de la llista. Vegem un exemple de llista a R.

|_+_|

Sortida:

|_+_|
    Marcs de dades:

Data Frames és una altra estructura de dades en el llenguatge de programació R. Es representa en format tabular. En altres paraules, es pot tractar com a matrius bidimensionals, on els valors de les columnes poden ser de qualsevol tipus. La funció anomenada data.frame() s'utilitza per crear l'estructura del marc de dades.

Representem un exemple per entendre com es crea el marc de dades a R.

|_+_|

Sortida:

|_+_|

Per què utilitzar la funció familiar R apply()?

En programació, fem servir a per bucle per a la iteració. Tanmateix, hi ha alguns efectes adversos de l'ús de bucles. Utilitzem objectes al bucle for. Aquests objectes romanen dins del bucle for a l'espai de treball. Algunes persones poden requerir aquests objectes, mentre que altres poden tractar-los com a no desitjats. Vegem com el bucle for té efectes secundaris amb un exemple.

|_+_|

Aquest és el codi. Quina és la sortida esperada? Podríeu esperar el resultat com la corda, 'Brillant a l'ombra...'. Després d'executar aquest codi, el resultat real que obteniu és 5, com per a les execucions de bucle durant 5 iteracions.

Sortida:

|_+_|

Per a cada iteració, la variable 'cançó' pren valor del vector 'cançó'.

El llenguatge de programació R introdueix un altre sistema de bucle robust per evitar els problemes causats pel bucle for. El nou sistema de bucle és aplicar la família. Una família d'aplicació és la col·lecció de funcions que no tenen cap efecte secundari com el bucle for. Hi ha set funcions incorporades en una família d'aplicacions.

Característiques de la funció familiar apply().

Aquí hi ha algunes característiques essencials de les funcions de la família apply(). Abans d'endinsar-nos en els detalls de la funció familiar apply(), considerarem algunes característiques principals.

  1. Hi ha dos arguments presents a cada funció de la família apply(). El primer argument que s'ha de passar a la funció apply() és l'objecte i el segon és la funció. R permet una disposició per tractar una funció com un argument mentre la passa a qualsevol de les funcions apply().
  2. Una de les característiques principals i significatives de l'ús de les funcions de la família apply() és que no hi ha efectes secundaris en el codi.
  3. Les funcions apply() utilitzen arguments de punts per passar arguments a qualsevol funció.
  4. Sempre que utilitzem qualsevol funció apply(), retorna una mica de sortida després d'executar el codi. Utilitzeu les funcions apply() només si són necessàries. Per exemple, si només voleu resultats a l'indicador d'ordres mitjançant la funció print(), no utilitzeu les funcions apply().

Avantatges de la funció apply() sobre el bucle tradicional

Qualsevol codi o bloc de codi s'executa més ràpidament amb les funcions apply() que els bucles tradicionals. Hi ha diversos paquets integrats disponibles en el llenguatge de programació R. Un dels paquets de R és gamclass, que inclou el conjunt de dades del sistema d'enregistrament d'anàlisi de mortalitat (FARS). El conjunt de dades FARS té 17 característiques diferents amb 15118 observacions.

Prenem un exemple per veure el temps necessari per executar el codi mitjançant la funció apply() i el mètode de bucle tradicional. Considereu que hem de trobar la mitjana dels pesos donats. Per tant, construirem un codi utilitzant el bucle for i la funció apply().

|_+_|

Utilitzant el bucle for:

Utilitzant la funció apply():

|_+_|

L'ús de la funció apply() requereix menys línies de codi que el bucle for. Hem de veure el temps necessari per calcular la mitjana dels pesos donats. Per tant, utilitzarem un paquet de R únic, anomenat Profvis.

L'objectiu principal del paquet Provifs és oferir una representació gràfica del temps i la memòria que consumeix cada instrucció del codi. Per tant, l'ús del paquet Provifs ens permetrà conèixer el temps necessari per calcular la mitjana del pes mitjançant la funció de bucle for i apply().

|_+_|

Utilitzant el bucle for:

A la sortida del codi anterior, notareu que es mostrarà el temps necessari per al bucle for.

|_+_|

La línia de codi triga 30 ms a executar-se.

|_+_|

Aquesta línia de codi triga 1600 ms a executar-se. Per tant, dues línies triguen 1900 ms a executar-se.

|_+_|

Utilitzant la funció apply():

Al codi anterior, la línia

|_+_|

només triga 20 ms per a l'execució.

Vegeu també 4 solucions per no poder crear el fitxer de dades d'Outlook

A partir de les dues execucions de codi anteriors, concloem que la funció apply() és beneficiosa i estalvia temps que el bucle for tradicional. També és senzill utilitzar la funció apply(), ja que requereix menys línies de codi. Coneixem ara diferents funcions apply() i les seves implementacions.

Aplicar () Funció

Hem estudiat cinc estructures de dades diferents del llenguatge de programació R. La funció apply() utilitza dues de cada cinc estructures de dades, marc de dades i matriu. En altres paraules, el marc de dades i la matriu s'utilitzen com a entrada a la funció apply(). La sortida de la funció apply() s'expressa en un vector.

La funció apply() és la funció fonamental de totes les altres funcions. Evita el problema de les construccions de bucles explícites. Vegem quins arguments s'utilitzen a la funció apply(). A continuació es mostra la sintaxi:

|_+_|

Anem a discutir cada argument de la funció apply() en detall. El primer paràmetre, X, implica una matriu o una matriu. A continuació, MARGEN representa dos valors 1 i 2, que indiquen en quines dades s'ha d'utilitzar l'aplicació ().

Per MARGIN=1, la funció apply() s'ha d'utilitzar a les files, mentre que, per MARGIN=2, la funció apply() s'ha d'aplicar a les columnes. L'últim paràmetre, FUN, representa la funció a aplicar. Si voleu utilitzar la funció apply() a files i columnes, heu de definir MARGEN = c(1,2).

Hi ha diverses funcions integrades al llenguatge de programació R, com ara suma, mitjana, mediana, màxima i mínima. També podeu utilitzar funcions definides per l'usuari. Ara veurem l'exemple on es pot utilitzar la funció apply(). Preneu un exemple d'afegir dues matrius a totes les columnes.

|_+_|

A les línies superiors de codi, hem mostrat la matriu p. Per tant, la sortida serà:

[ ,1][ , 2][ , 3][ , 4][ , 5][ ,6]
[1, ]161616
[2, ]272727
[3, ]383838
[4, ]494949
[5, ]510510510

Hem fet la suma de columnes i la sortida serà la següent:

Sortida:

|_+_|

lappaly () Funció

Una altra funció de la funció familiar apply() és la funció lapply(). A la funció lapply(), utilitzem la llista com a entrada i produeix una llista com a sortida. La longitud de la llista de sortida és la mateixa que la de la llista d'entrada. En el context de la funció lapply(), l implica una llista. A més, la funció lapply() també pren un marc de dades i un vector com a entrades i produeix la llista com a sortida. A continuació es mostra la sintaxi de la funció lapply():

|_+_|

La funció lapply() pren dos arguments. Aquí, X implica un objecte o vector, i FUN representa qualsevol funció que s'ha d'aplicar a l'objecte.

Diferència entre les funcions apply() i lapply():

  1. A la funció apply(), l'entrada proporcionada és el marc de dades i la matriu. D'altra banda, la funció lapply() pren el marc de dades, la llista i el vector com a entrada.
  2. La sortida de la funció apply() es representa com un vector, mentre que la sortida de la funció lapply() està en forma de llista.
  3. La funció lapply() no inclou l'argument MARGIN.

Prenem un exemple per entendre com funciona la funció lapply(). En aquest exemple, convertirem la cadena de la matriu majúscula en minúscula.

|_+_|

Resultat:

|_+_|

Podeu convertir la vostra llista en un vector utilitzant la funció unlist(). Feu-nos saber com funciona la funció unlist().

|_+_|

Sortida:

|_+_|

funció sapply ().

Una altra funció de la família apply() és la funció saply(). La funció sapply() pren estructures de dades vectorials o marc de dades com a entrada i produeix la sortida en forma vectorial o matriu. A més, la funció sapply() pren la llista com a entrada i genera la mateixa llista de longitud que la sortida. Les funcions lapply() i apply() són similars, però l'única diferència és que apply() produeix un vector.

A continuació es mostra la sintaxi de la funció saply():

|_+_|

La funció sapply() pren dos paràmetres d'entrada, X i FUN. El paràmetre, X, implica un vector o un objecte, i el FUN significa la funció que s'utilitzarà amb X.

Vegeu també Com silenciar l'àudio del zoom en un ordinador o dispositiu mòbil

Diferència entre les funcions apply() i saply():

  1. La funció apply() pren el marc de dades i una matriu com a entrada, mentre que la funció saply() pren el marc de dades, el vector i la llista com a entrada. La funció lapply() també pren la mateixa entrada que la funció sapply().
  2. A continuació, la funció apply() presenta el seu resultat com a vector. D'altra banda, la funció sapply() produeix un vector i una llista com a sortides. La funció lapply() només té sortida com a llista.
  3. Igual que la funció lapply(), la funció saply() tampoc té MARGE en els seus arguments.

El codi següent mostra un exemple de la funció sapply(). El codi següent utilitza el conjunt de dades del cotxe i calcula la velocitat i les distàncies d'aturada mínimes dels cotxes.

|_+_|

Sortida: la sortida següent es genera a partir de la funció lapply() i mostra la velocitat mínima i la distància de parada.

|_+_|

Sortida: el resultat següent es produeix a partir de la funció sapply(), que representa la velocitat i les distàncies d'aturada mínimes.

|_+_|

Vegem un exemple diferent, que mostra la distància màxima d'aturada i la velocitat dels cotxes.

|_+_|

Sortida: aquí, el resultat s'obté de la funció lapply(), que mostra la velocitat i la distància màximes.

|_+_|

La sortida de la línia anterior s'obté mitjançant la funció saply().

Sortida:

|_+_|

Un dels avantatges importants d'utilitzar les funcions lapply() i sapply() és que els usuaris poden utilitzar funcions definides per l'usuari. Ara sabrem com es pot utilitzar la funció definida per l'usuari dins de les funcions lapply() i sapply().

En l'exemple actual, definirem una funció avgr, que trobarà la mitjana mínima i màxima d'un vector.

|_+_|

Sortida:

|_+_|

Diferència entre les funcions apply(), sapply() i lapply().

La taula següent mostra les diferències generals entre les tres funcions anteriors, apply(), lapply() i sapply().

FuncióArgumentsObjectiuEntradaSortida
aplicar ()Es necessita tres arguments, a saber, X, MARGE i DIVERTIT.Utilitzem la funció apply() a les files i columnes d'una matriu.La funció apply() pren com a entrada un marc de dades o un vector.Produeix una sortida en forma de llista, matriu o vector.
solapa ()La funció lapply() inclou dos arguments, X i FUN. No té el MARGE.S'utilitza per aplicar a tots els elements d'una llista, vector o marc de dades.Aquesta funció implica estructures de dades d'entrada, com ara llista, vector o marc de dades.La funció lapply() només genera una llista com a sortida.
sapply ()Aquesta funció també té dos arguments, X i FUN. L'argument ARGIN no està inclòs.Podeu utilitzar la funció saply() per utilitzar-la en tots els elements de l'entrada.La funció sapply() també pren com a entrada una llista, un vector o un marc de dades.Representa la sortida en forma vectorial o matriu.

Funció tapply().

La funció tapply() s'utilitza per calcular la mitjana, la mediana, la mitjana, la màxima, la mínima, la suma, etc. Podeu calcular aquestes mesures per a cada variable factor d'un vector. Una de les parts interessants de la funció tapply() és agafar qualsevol part del subconjunt d'un vector i realitzar-hi qualsevol mesura. A continuació es mostra la sintaxi de la funció tapply():

|_+_|

Aquí, X és un objecte o un vector, INDEX és una llista que conté un factor i FUN és una funció aplicada a X.

Entendrem la funció tapply() prenent un exemple del conjunt de dades de l'iris. Els científics de dades o els investigadors realitzen agrupacions de dades en funció de característiques específiques, com ara l'identificador, el país o la ciutat. El domini d'aprenentatge automàtic utilitza àmpliament el conjunt de dades de l'iris.

Suposem que hi ha tres tipus de flors diferents, Sèpal, Versicolor i Virginica. El conjunt de dades de l'iris prediu les espècies de flors recopilant informació, com ara la longitud i l'amplada de les flors. Considereu que hem de calcular la longitud mitjana de cada espècie. Podeu utilitzar la funció tapply() per calcular la mitjana de la longitud.

|_+_|

Sortida:

|_+_|

Funció mapply().

La funció mapply() de la família apply() és similar a la funció saply(). També genera un vector com a sortida. La funció mapply() també es coneix com a funció multivariable. El nom és la funció multivariant, ja que es pot utilitzar amb múltiples arguments vectorials i de llista. En altres paraules, la funció mapply() s'utilitza per dur a terme iteracions en diversos objectes paral·lelament. El FUN de la funció mapply() s'utilitza amb cada element de cada argument.

L'exemple següent farà que la vostra comprensió sigui més clara sobre la funció mapply().

|_+_|

Sortida:

|_+_|

Aquí, la funció és l'argument passat a la funció mapply(). La funció implica dos paràmetres, a i b. El segon argument donat és a=c(3,4), i el tercer argument és b=c(2,3). Per tant, a i b tenen dos valors diferents. Per tant, la funció de mapply() s'anomena dues vegades. La primera crida de la funció mapply() és per a a=3 i y=2. Per a x=4 i y=3, la segona crida es dóna a la funció mapply().

Conclusió

El llenguatge de programació R està especialment desenvolupat per representar dades estadístiques i gràfiques. RStudio és una interfície particular dissenyada per al llenguatge R. Hi ha cinc estructures de dades primàries en els llenguatges R. Són vector, llista, matrius, marc de dades i matriu. Hem vist cadascuna d'aquestes estructures de dades R en detall amb les seves sintaxis.

S'incorporen diverses funcions a la funció familiar apply(). Aquest article inclou les funcions apply(), lapply(), sapply(), tapply() i mapply(). Cada funció pertany a la família apply() i s'explica clarament amb exemples.

Més tard, vam analitzar la diferència entre les funcions apply() i lapply(), les funcions ad apply() i sapply(). Una comparació detallada de les funcions apply(), lapply() i sapply() es mostra en una taula, cosa que fa que qualsevol lector sigui més fàcil d'entendre.