Saltar al contenido principal
LibreTexts Español

8.5: Bucles implícitos

  • Page ID
    151699
  • \( \newcommand{\vecs}[1]{\overset { \scriptstyle \rightharpoonup} {\mathbf{#1}} } \)

    \( \newcommand{\vecd}[1]{\overset{-\!-\!\rightharpoonup}{\vphantom{a}\smash {#1}}} \)

    \( \newcommand{\id}{\mathrm{id}}\) \( \newcommand{\Span}{\mathrm{span}}\)

    ( \newcommand{\kernel}{\mathrm{null}\,}\) \( \newcommand{\range}{\mathrm{range}\,}\)

    \( \newcommand{\RealPart}{\mathrm{Re}}\) \( \newcommand{\ImaginaryPart}{\mathrm{Im}}\)

    \( \newcommand{\Argument}{\mathrm{Arg}}\) \( \newcommand{\norm}[1]{\| #1 \|}\)

    \( \newcommand{\inner}[2]{\langle #1, #2 \rangle}\)

    \( \newcommand{\Span}{\mathrm{span}}\)

    \( \newcommand{\id}{\mathrm{id}}\)

    \( \newcommand{\Span}{\mathrm{span}}\)

    \( \newcommand{\kernel}{\mathrm{null}\,}\)

    \( \newcommand{\range}{\mathrm{range}\,}\)

    \( \newcommand{\RealPart}{\mathrm{Re}}\)

    \( \newcommand{\ImaginaryPart}{\mathrm{Im}}\)

    \( \newcommand{\Argument}{\mathrm{Arg}}\)

    \( \newcommand{\norm}[1]{\| #1 \|}\)

    \( \newcommand{\inner}[2]{\langle #1, #2 \rangle}\)

    \( \newcommand{\Span}{\mathrm{span}}\) \( \newcommand{\AA}{\unicode[.8,0]{x212B}}\)

    \( \newcommand{\vectorA}[1]{\vec{#1}}      % arrow\)

    \( \newcommand{\vectorAt}[1]{\vec{\text{#1}}}      % arrow\)

    \( \newcommand{\vectorB}[1]{\overset { \scriptstyle \rightharpoonup} {\mathbf{#1}} } \)

    \( \newcommand{\vectorC}[1]{\textbf{#1}} \)

    \( \newcommand{\vectorD}[1]{\overrightarrow{#1}} \)

    \( \newcommand{\vectorDt}[1]{\overrightarrow{\text{#1}}} \)

    \( \newcommand{\vectE}[1]{\overset{-\!-\!\rightharpoonup}{\vphantom{a}\smash{\mathbf {#1}}}} \)

    \( \newcommand{\vecs}[1]{\overset { \scriptstyle \rightharpoonup} {\mathbf{#1}} } \)

    \( \newcommand{\vecd}[1]{\overset{-\!-\!\rightharpoonup}{\vphantom{a}\smash {#1}}} \)

    \(\newcommand{\avec}{\mathbf a}\) \(\newcommand{\bvec}{\mathbf b}\) \(\newcommand{\cvec}{\mathbf c}\) \(\newcommand{\dvec}{\mathbf d}\) \(\newcommand{\dtil}{\widetilde{\mathbf d}}\) \(\newcommand{\evec}{\mathbf e}\) \(\newcommand{\fvec}{\mathbf f}\) \(\newcommand{\nvec}{\mathbf n}\) \(\newcommand{\pvec}{\mathbf p}\) \(\newcommand{\qvec}{\mathbf q}\) \(\newcommand{\svec}{\mathbf s}\) \(\newcommand{\tvec}{\mathbf t}\) \(\newcommand{\uvec}{\mathbf u}\) \(\newcommand{\vvec}{\mathbf v}\) \(\newcommand{\wvec}{\mathbf w}\) \(\newcommand{\xvec}{\mathbf x}\) \(\newcommand{\yvec}{\mathbf y}\) \(\newcommand{\zvec}{\mathbf z}\) \(\newcommand{\rvec}{\mathbf r}\) \(\newcommand{\mvec}{\mathbf m}\) \(\newcommand{\zerovec}{\mathbf 0}\) \(\newcommand{\onevec}{\mathbf 1}\) \(\newcommand{\real}{\mathbb R}\) \(\newcommand{\twovec}[2]{\left[\begin{array}{r}#1 \\ #2 \end{array}\right]}\) \(\newcommand{\ctwovec}[2]{\left[\begin{array}{c}#1 \\ #2 \end{array}\right]}\) \(\newcommand{\threevec}[3]{\left[\begin{array}{r}#1 \\ #2 \\ #3 \end{array}\right]}\) \(\newcommand{\cthreevec}[3]{\left[\begin{array}{c}#1 \\ #2 \\ #3 \end{array}\right]}\) \(\newcommand{\fourvec}[4]{\left[\begin{array}{r}#1 \\ #2 \\ #3 \\ #4 \end{array}\right]}\) \(\newcommand{\cfourvec}[4]{\left[\begin{array}{c}#1 \\ #2 \\ #3 \\ #4 \end{array}\right]}\) \(\newcommand{\fivevec}[5]{\left[\begin{array}{r}#1 \\ #2 \\ #3 \\ #4 \\ #5 \\ \end{array}\right]}\) \(\newcommand{\cfivevec}[5]{\left[\begin{array}{c}#1 \\ #2 \\ #3 \\ #4 \\ #5 \\ \end{array}\right]}\) \(\newcommand{\mattwo}[4]{\left[\begin{array}{rr}#1 \amp #2 \\ #3 \amp #4 \\ \end{array}\right]}\) \(\newcommand{\laspan}[1]{\text{Span}\{#1\}}\) \(\newcommand{\bcal}{\cal B}\) \(\newcommand{\ccal}{\cal C}\) \(\newcommand{\scal}{\cal S}\) \(\newcommand{\wcal}{\cal W}\) \(\newcommand{\ecal}{\cal E}\) \(\newcommand{\coords}[2]{\left\{#1\right\}_{#2}}\) \(\newcommand{\gray}[1]{\color{gray}{#1}}\) \(\newcommand{\lgray}[1]{\color{lightgray}{#1}}\) \(\newcommand{\rank}{\operatorname{rank}}\) \(\newcommand{\row}{\text{Row}}\) \(\newcommand{\col}{\text{Col}}\) \(\renewcommand{\row}{\text{Row}}\) \(\newcommand{\nul}{\text{Nul}}\) \(\newcommand{\var}{\text{Var}}\) \(\newcommand{\corr}{\text{corr}}\) \(\newcommand{\len}[1]{\left|#1\right|}\) \(\newcommand{\bbar}{\overline{\bvec}}\) \(\newcommand{\bhat}{\widehat{\bvec}}\) \(\newcommand{\bperp}{\bvec^\perp}\) \(\newcommand{\xhat}{\widehat{\xvec}}\) \(\newcommand{\vhat}{\widehat{\vvec}}\) \(\newcommand{\uhat}{\widehat{\uvec}}\) \(\newcommand{\what}{\widehat{\wvec}}\) \(\newcommand{\Sighat}{\widehat{\Sigma}}\) \(\newcommand{\lt}{<}\) \(\newcommand{\gt}{>}\) \(\newcommand{\amp}{&}\) \(\definecolor{fillinmathshade}{gray}{0.9}\)

    Hay un último tema que quiero discutir en este capítulo. Además de proporcionar las estructuras de bucle explícitas vía while y for, R también proporciona una colección de funciones para bucles implícitos. Lo que quiero decir con esto es que estas son funciones que realizan operaciones muy similares a las para las que normalmente usarías un loop. Sin embargo, en lugar de escribir todo el bucle, todo se hace con un solo comando. La razón principal por la que esto puede ser útil es que —debido a la forma en que se escribe R— estas funciones de bucle implícito suelen estar a punto de hacer los mismos cálculos mucho más rápido que los bucles explícitos correspondientes. En la mayoría de las aplicaciones que los principiantes pueden querer emprender, esto probablemente no sea muy importante, ya que la mayoría de los principiantes tienden a comenzar a trabajar con conjuntos de datos bastante pequeños y generalmente no necesitan realizar un procesamiento de números extremadamente lento. Sin embargo, debido a que a menudo se ven estas funciones referidas en otros contextos, puede ser útil discutir muy brevemente algunas de ellas.

    La primera y más simple de estas funciones es sapply (). Los dos argumentos más importantes para esta función son X, que especifica un vector que contiene los datos, y FUN, que especifica el nombre de una función que se debe aplicar a cada elemento del vector de datos. El siguiente ejemplo ilustra los conceptos básicos de cómo funciona:

    words <- c("along", "the", "loom", "of", "the", "land")
    sapply( X = words, FUN = nchar )
    ## along   the  loom    of   the  land 
    ##     5     3     4     2     3     4

    Observe lo similar que es esto al segundo ejemplo de un bucle for en la Sección 8.2.2. La función sapply () ha girado implícitamente sobre los elementos de las palabras, y para cada elemento aplicado la función nchar () para calcular el número de letras en la palabra correspondiente.

    La segunda de estas funciones es tapply (), que tiene tres argumentos clave. Como antes X especifica los datos, y FUN especifica una función. Sin embargo, también hay un argumento INDEX que especifica una variable de agrupación. 140 Lo que hace la función tapply () es recorrer todos los diferentes valores que aparecen en la variable INDEX. Cada uno de esos valores define un grupo: la función tapply () construye el subconjunto de X que corresponde a ese grupo, y luego aplica la función FUN a ese subconjunto de los datos. Esto probablemente suene un poco abstracto, así que consideremos un ejemplo específico, usando el archivo Nightgarden.rdata que usamos en el Capítulo 7.

    gender <- c( "male","male","female","female","male" )
    age <- c( 10,12,9,11,13 )
    tapply( X = age, INDEX = gender, FUN = mean )
    ##   female     male 
    ## 10.00000 11.66667

    En este extracto, lo que estamos haciendo es usar el género para definir dos grupos diferentes de personas, y usar sus edades como datos. Luego calculamos la media () de las edades, por separado para los machos y las hembras. Una función estrechamente relacionada es by (). En realidad hace lo mismo que tapply (), pero la salida tiene un formato un poco diferente. Esta vez alrededor de los tres argumentos se llaman datos, INDICES y DIVERSIÓN, pero son más o menos lo mismo. Un ejemplo de cómo usar la función by () se muestra en el siguiente extracto:

    by( data = age, INDICES = gender, FUN = mean )
    ## gender: female
    ## [1] 10
    ## -------------------------------------------------------- 
    ## gender: male
    ## [1] 11.66667

    Las funciones tapply () y by () son cosas bastante útiles para conocer y son bastante utilizadas. No obstante, aunque más adelante hago referencia pasajera al tapply (), no hago mucho uso de ellos en este libro.

    Antes de seguir adelante, debo mencionar que hay varias otras funciones que funcionan en líneas similares, y tienen nombres sospechosamente similares: lapply, mapply, apply, vapply, rapply y eapply. No obstante, ninguno de estos aparece en ningún otro lugar de este libro, así que todo lo que quería hacer aquí es llamar su atención sobre el hecho de que existen.


    This page titled 8.5: Bucles implícitos is shared under a CC BY-SA 4.0 license and was authored, remixed, and/or curated by Danielle Navarro via source content that was edited to the style and standards of the LibreTexts platform.