<div dir="ltr"><div class="gmail_default" style="font-family:verdana,sans-serif">Hola,<br><br></div><div class="gmail_default" style="font-family:verdana,sans-serif">He querido comprobar los tiempos proceso que se obtendrían utilizando una u otra opción (mapply vs. sapply) para un conjunto equivalente en tamaño al que Fernando planteaba (data.frame de 316 columnas y 562000 filas).<br><br></div><div class="gmail_default" style="font-family:verdana,sans-serif">Y estos son los resultados:<br><ul><li>En mi máquina MacAir (4GB RAM - 1.3GHz Intel Core i5) :</li><ul><li>con mapply obtengo tiempos de 1.4 minutos.</li><li>con sapply se me bloqueaba RStudio.</li></ul></ul></div><div class="gmail_default" style="font-family:verdana,sans-serif">En ambos casos, iniciaba sesión "limpia" de RStudio.<br><br></div><div class="gmail_default" style="font-family:verdana,sans-serif">Para no tener problemas de máquina he probado ambos casos en la plataforma "Microsoft Azure Machine Learning" y los resultados son los siguientes:<br><ul><li>mapply: 34.862 segundos</li><li>sapply: 35.057 segundos<br></li></ul></div><div class="gmail_default" style="font-family:verdana,sans-serif">Sobre la plataforma de Microsoft, he vuelto a ver un comportamiento raro con la opción de sapply, hasta que he cambiado en la función "as.character()" por "as.vector()" y es cuando ha funcionado sin problemas con los tiempos indicados.<br><br></div><div class="gmail_default" style="font-family:verdana,sans-serif">Adjunto capturas de pantalla del código ejecutado en cada caso y los tiempos de ejecución que proporciona la plataforma.<br></div><div class="gmail_default" style="font-family:verdana,sans-serif">En ambos casos, los tiempos incluyen la generación del data.frame equivalente (562000 x 316).<br></div><div class="gmail_default" style="font-family:verdana,sans-serif"><br><br><br><b>OPCIÓN A (MAPPLY)</b><br><br><img alt="Imágenes integradas 2" src="cid:ii_14bbd61b9b8e2327" height="482" width="530"><br><img alt="Imágenes integradas 6" src="cid:ii_14bbd712a4d8d341" height="355" width="473"><br><br><br><br><br></div><div class="gmail_default" style="font-family:verdana,sans-serif"><b>OPCIÓN B (SAPPLY)</b><br></div><div class="gmail_default" style="font-family:verdana,sans-serif"><br><br><img alt="Imágenes integradas 1" src="cid:ii_14bbd60800cfbd25" height="552" width="543"><br><br><img alt="Imágenes integradas 5" src="cid:ii_14bbd6e5737a25f4" height="433" width="558"><br></div></div><div class="gmail_extra"><br><div class="gmail_quote">El 24 de febrero de 2015, 17:12, Fernando Macedo <span dir="ltr"><<a href="mailto:fermace@gmail.com" target="_blank">fermace@gmail.com</a>></span> escribió:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div dir="ltr">
  
    
  
  <div bgcolor="#FFFFFF" text="#000000">
    <div>Muchas gracias a los dos, los ejemplos
      de uso de las funciones *apply siempre son bienvenidos. <br>
      <br>
      Saludos <br>
      <br>
      <pre cols="72">Fernando Macedo
</pre>
      El 24/02/15 a las 12:12, Jorge I Velez escribió:<br>
    </div><div><div class="h5">
    <blockquote type="cite">
      <div dir="ltr">
        <div class="gmail_default" style="font-family:arial,helvetica,sans-serif;font-size:small">Gracias,
          Carlos.</div>
        <div class="gmail_default" style="font-family:arial,helvetica,sans-serif;font-size:small"><br>
        </div>
        <div class="gmail_default" style="font-family:arial,helvetica,sans-serif;font-size:small">Habia
          pensado en algo similar usando sapply():</div>
        <div class="gmail_default" style="font-family:arial,helvetica,sans-serif;font-size:small"><br>
        </div>
        <div class="gmail_default" style="font-family:arial,helvetica,sans-serif;font-size:small">sapply(seq(1,
          ncol(vtmp), by = 2), function(i) c(rbind(as.character(vtmp[,
          i]), as.character(vtmp[, i+1]))))<br>
        </div>
        <div class="gmail_default" style="font-family:arial,helvetica,sans-serif;font-size:small"><br>
        </div>
        <div class="gmail_default" style="font-family:arial,helvetica,sans-serif;font-size:small">Dependiendo
          de la dimension de los datos, quizas mapply() sea
          mas eficiente que sapply().</div>
        <div class="gmail_default" style="font-family:arial,helvetica,sans-serif;font-size:small"><br>
        </div>
        <div class="gmail_default" style="font-family:arial,helvetica,sans-serif;font-size:small">Saludos
          cordiales,</div>
        <div class="gmail_default" style="font-family:arial,helvetica,sans-serif;font-size:small">Jorge.-</div>
        <div class="gmail_default" style="font-family:arial,helvetica,sans-serif;font-size:small"><br>
        </div>
        <div class="gmail_default"><br>
        </div>
        <div class="gmail_extra">
          <div class="gmail_quote">2015-02-25 1:01 GMT+11:00 Carlos
            Ortega <span dir="ltr"><<a href="mailto:cof@qualityexcellence.es" target="_blank">cof@qualityexcellence.es</a>></span>:<br>
            <blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
              <div dir="ltr">
                <div style="font-family:verdana,sans-serif">Hola,<br>
                  <br>
                </div>
                <div style="font-family:verdana,sans-serif">Este otro
                  ejemplo a partir de la idea de Jorge, de cómo procesar
                  toda la tabla que tienes:<br>
                  <br>
                  > #Creo un data.frame de ejemplo todo con letras<br>
                  > vtmp <-
                  as.data.frame(lapply(letters,function(x) {
                  rep(x,each=50) }))<br>
                  > names(vtmp) <- paste("col",LETTERS,sep="")<br>
                  > head(vtmp)<br>
                    colA colB colC colD colE colF colG colH colI colJ
                  colK colL colM colN colO colP colQ colR colS colT colU
                  colV colW colX colY colZ<br>
                  1    a    b    c    d    e    f    g    h    i    j   
                  k    l    m    n    o    p    q    r    s    t    u   
                  v    w    x    y    z<br>
                  2    a    b    c    d    e    f    g    h    i    j   
                  k    l    m    n    o    p    q    r    s    t    u   
                  v    w    x    y    z<br>
                  3    a    b    c    d    e    f    g    h    i    j   
                  k    l    m    n    o    p    q    r    s    t    u   
                  v    w    x    y    z<br>
                  4    a    b    c    d    e    f    g    h    i    j   
                  k    l    m    n    o    p    q    r    s    t    u   
                  v    w    x    y    z<br>
                  5    a    b    c    d    e    f    g    h    i    j   
                  k    l    m    n    o    p    q    r    s    t    u   
                  v    w    x    y    z<br>
                  6    a    b    c    d    e    f    g    h    i    j   
                  k    l    m    n    o    p    q    r    s    t    u   
                  v    w    x    y    z<br>
                  > <br>
                  > #Los números de columnas impares de mi data.frame<br>
                  > matIndex <- seq(1, dim(vtmp)[2], by=2)<br>
                  > <br>
                  > #Función para juntar dos columnas (idea de Jorge)<br>
                  > mifun <- function(x,y)
                  c(rbind(as.vector(vtmp[,x]),as.vector(vtmp[,y])))<br>
                  > <br>
                  > #Resulado aplicando mapply. Coge dos columnas
                  consecutivas y las alterna<br>
                  > #y así de forma iterativa para cada una de las
                  columnas que indica "matIndex" y la siguiente columna
                  "matIndex+1" <br>
                  > resultado <- mapply(mifun,matIndex,
                  matIndex+1)<br>
                  > head(kk)<br>
                       [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9]
                  [,10] [,11] [,12] [,13]<br>
                  [1,] "a"  "c"  "e"  "g"  "i"  "k"  "m"  "o"  "q" 
                  "s"   "u"   "w"   "y"  <br>
                  [2,] "b"  "d"  "f"  "h"  "j"  "l"  "n"  "p"  "r" 
                  "t"   "v"   "x"   "z"  <br>
                  [3,] "a"  "c"  "e"  "g"  "i"  "k"  "m"  "o"  "q" 
                  "s"   "u"   "w"   "y"  <br>
                  [4,] "b"  "d"  "f"  "h"  "j"  "l"  "n"  "p"  "r" 
                  "t"   "v"   "x"   "z"  <br>
                  [5,] "a"  "c"  "e"  "g"  "i"  "k"  "m"  "o"  "q" 
                  "s"   "u"   "w"   "y"  <br>
                  [6,] "b"  "d"  "f"  "h"  "j"  "l"  "n"  "p"  "r" 
                  "t"   "v"   "x"   "z"  <br>
                  > <br>
                  <br>
                </div>
                <div style="font-family:verdana,sans-serif">Saludos,<br>
                </div>
                <div style="font-family:verdana,sans-serif">Carlos
                  Ortega<br>
                </div>
                <div style="font-family:verdana,sans-serif"><a href="http://www.qualityexcellence.es" target="_blank">www.qualityexcellence.es</a><br>
                </div>
              </div>
              <div class="gmail_extra"><br>
                <div class="gmail_quote">El 24 de febrero de 2015,
                  14:10, Fernando Macedo <span dir="ltr"><<a href="mailto:fermace@gmail.com" target="_blank">fermace@gmail.com</a>></span>
                  escribió:
                  <div>
                    <div><br>
                      <blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"> Excelente! Ahora corre
                        muy rápido. No conocía ese método, creo que me
                        va a<br>
                        resultar muy útil.<br>
                        <br>
                        Muchas gracias y saludos.<br>
                        <br>
                        Fernando Macedo<br>
                        <br>
                        El 24/02/15 a las 10:51, Jorge I Velez escribió:<br>
                        <div>
                          <div><br>
                             Fernando,<br>
                            <br>
                             Podrias intentar<br>
                            <br>
                             R> a <- rep('a', 5)<br>
                            R> b <- rep('b', 5)<br>
                            R> a<br>
                            [1] "a" "a" "a" "a" "a"<br>
                            R> b<br>
                            [1] "b" "b" "b" "b" "b"<br>
                            R> c(rbind(a, b))<br>
                              [1] "a" "b" "a" "b" "a" "b" "a" "b" "a"
                            "b"<br>
                            <br>
                             Saludos,<br>
                            Jorge.-<br>
                            <br>
                            <br>
                            2015-02-24 23:49 GMT+11:00 Fernando Macedo
                            <<a href="mailto:fermace@gmail.com" target="_blank">fermace@gmail.com</a>>:<br>
                            <br>
                            >  Buenas a todos.<br>
                            > Relato el problema:<br>
                            ><br>
                            > - tengo un archivo de 316 columnas por
                            562000 filas (aprox.).<br>
                            > - esas 316 columnas representan 158
                            sujetos, o sea dos columnas por cada<br>
                            > individuo conteniendo información que
                            debe ser condensada en una sola.<br>
                            ><br>
                            > Lo que necesito es ir tomando las dos
                            columnas de cada individuo e<br>
                            > intercalar los elementos de los
                            vectores formando uno solo.<br>
                            ><br>
                            > Ejemplificando sería algo así:<br>
                            ><br>
                            > > a<br>
                            > [1] "a" "a" "a" "a" "a"<br>
                            > > b<br>
                            > [1] "b" "b" "b" "b" "b"<br>
                            > > c<br>
                            >  [1] "a" "b" "a" "b" "a" "b" "a" "b"
                            "a" "b"<br>
                            ><br>
                            ><br>
                            > Estoy haciendo con un loop for pero es
                            realmente muy lento. He buscado por<br>
                            > algún paquete que ya lo haga
                            directamente pero no he tenido mucho éxito.
                            Me<br>
                            > imagino que con sapply o apply pueda
                            ser mucho más efectivo pero me ha<br>
                            > resultado complicado para entender la
                            sintaxis de estas funciones cuando<br>
                            > involucra más de un objeto (vector,
                            matriz, etc...).<br>
                            ><br>
                            > Desde ya agradezco las sugerencias que
                            puedan verter sobre este problema.<br>
                            ><br>
                            > --<br>
                            > Fernando Macedo<br>
                            ><br>
                            >         [[alternative HTML version
                            deleted]]<br>
                            ><br>
                            >
                            _______________________________________________<br>
                            > R-help-es mailing list<br>
                            > <a href="mailto:R-help-es@r-project.org" target="_blank">R-help-es@r-project.org</a><br>
                            > <a href="https://stat.ethz.ch/mailman/listinfo/r-help-es" target="_blank">https://stat.ethz.ch/mailman/listinfo/r-help-es</a><br>
                            ><br>
                            <br>
                                    [[alternative HTML version deleted]]<br>
                            <br>
_______________________________________________<br>
                            R-help-es mailing list<br>
                            <a href="mailto:R-help-es@r-project.org" target="_blank">R-help-es@r-project.org</a><br>
                            <a href="https://stat.ethz.ch/mailman/listinfo/r-help-es" target="_blank">https://stat.ethz.ch/mailman/listinfo/r-help-es</a><br>
                          </div>
                        </div>
                      </blockquote>
                    </div>
                  </div>
                </div>
                <span><font color="#888888"><br>
                    <br clear="all">
                    <br>
                    -- <br>
                    <div><span style="font-family:verdana,sans-serif">Saludos,</span><br style="font-family:verdana,sans-serif">
                      <span style="font-family:verdana,sans-serif">Carlos
                        Ortega</span><br style="font-family:verdana,sans-serif">
                      <span style="font-family:verdana,sans-serif"><a href="http://www.qualityexcellence.es" target="_blank">www.qualityexcellence.es</a></span></div>
                  </font></span></div>
            </blockquote>
          </div>
          <br>
        </div>
        <div class="gmail_extra"><br>
        </div>
      </div>
    </blockquote>
    <br>
  </div></div></div>

</div>
</blockquote></div><br><br clear="all"><br>-- <br><div class="gmail_signature"><span style="font-family:verdana,sans-serif">Saludos,</span><br style="font-family:verdana,sans-serif">
<span style="font-family:verdana,sans-serif">Carlos Ortega</span><br style="font-family:verdana,sans-serif">
<span style="font-family:verdana,sans-serif"><a href="http://www.qualityexcellence.es" target="_blank">www.qualityexcellence.es</a></span></div>
</div>