[R-es] intercalar elementos de vectores

Fernando Macedo fermace en gmail.com
Vie Ago 21 14:36:50 CEST 2015


De vuelta a agradecer a ambos, porque justo ahora estaba de nuevo con un 
problema parecido y he vuelto a consultar el correo.

Muchas gracias por su ayuda!

Saludos

DMTV Fernando Macedo
Asistente del área Mejoramiento Genético
Facultad de Veterinaria - UdelarR - Uruguay
Tel: 26284291
Cel.: 098596947
fermace en gmail.com

El 24/02/15 a las 19:28, Carlos Ortega escibió:
> Hola,
>
> 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).
>
> Y estos son los resultados:
>
>   * En mi máquina MacAir (4GB RAM - 1.3GHz Intel Core i5) :
>       o con mapply obtengo tiempos de 1.4 minutos.
>       o con sapply se me bloqueaba RStudio.
>
> En ambos casos, iniciaba sesión "limpia" de RStudio.
>
> Para no tener problemas de máquina he probado ambos casos en la 
> plataforma "Microsoft Azure Machine Learning" y los resultados son los 
> siguientes:
>
>   * mapply: 34.862 segundos
>   * sapply: 35.057 segundos
>
> 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.
>
> Adjunto capturas de pantalla del código ejecutado en cada caso y los 
> tiempos de ejecución que proporciona la plataforma.
> En ambos casos, los tiempos incluyen la generación del data.frame 
> equivalente (562000 x 316).
>
>
>
> *OPCIÓN A (MAPPLY)*
>
> Imágenes integradas 2
> Imágenes integradas 6
>
>
>
>
> *OPCIÓN B (SAPPLY)*
>
>
> Imágenes integradas 1
>
> Imágenes integradas 5
>
> El 24 de febrero de 2015, 17:12, Fernando Macedo <fermace en gmail.com 
> <mailto:fermace en gmail.com>> escribió:
>
>     Muchas gracias a los dos, los ejemplos de uso de las funciones
>     *apply siempre son bienvenidos.
>
>     Saludos
>
>     Fernando Macedo
>
>     El 24/02/15 a las 12:12, Jorge I Velez escribió:
>>     Gracias, Carlos.
>>
>>     Habia pensado en algo similar usando sapply():
>>
>>     sapply(seq(1, ncol(vtmp), by = 2), function(i)
>>     c(rbind(as.character(vtmp[, i]), as.character(vtmp[, i+1]))))
>>
>>     Dependiendo de la dimension de los datos, quizas mapply() sea
>>     mas eficiente que sapply().
>>
>>     Saludos cordiales,
>>     Jorge.-
>>
>>
>>     2015-02-25 1:01 GMT+11:00 Carlos Ortega <cof en qualityexcellence.es
>>     <mailto:cof en qualityexcellence.es>>:
>>
>>         Hola,
>>
>>         Este otro ejemplo a partir de la idea de Jorge, de cómo
>>         procesar toda la tabla que tienes:
>>
>>         > #Creo un data.frame de ejemplo todo con letras
>>         > vtmp <- as.data.frame(lapply(letters,function(x) {
>>         rep(x,each=50) }))
>>         > names(vtmp) <- paste("col",LETTERS,sep="")
>>         > head(vtmp)
>>           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
>>         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
>>         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
>>         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
>>         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
>>         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
>>         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
>>         >
>>         > #Los números de columnas impares de mi data.frame
>>         > matIndex <- seq(1, dim(vtmp)[2], by=2)
>>         >
>>         > #Función para juntar dos columnas (idea de Jorge)
>>         > mifun <- function(x,y)
>>         c(rbind(as.vector(vtmp[,x]),as.vector(vtmp[,y])))
>>         >
>>         > #Resulado aplicando mapply. Coge dos columnas consecutivas
>>         y las alterna
>>         > #y así de forma iterativa para cada una de las columnas que
>>         indica "matIndex" y la siguiente columna "matIndex+1"
>>         > resultado <- mapply(mifun,matIndex, matIndex+1)
>>         > head(kk)
>>              [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10] [,11]
>>         [,12] [,13]
>>         [1,] "a"  "c"  "e"  "g"  "i"  "k" "m"  "o"  "q"  "s"   "u"  
>>         "w"   "y"
>>         [2,] "b"  "d"  "f"  "h"  "j"  "l" "n"  "p"  "r"  "t"   "v"  
>>         "x"   "z"
>>         [3,] "a"  "c"  "e"  "g"  "i"  "k" "m"  "o"  "q"  "s"   "u"  
>>         "w"   "y"
>>         [4,] "b"  "d"  "f"  "h"  "j"  "l" "n"  "p"  "r"  "t"   "v"  
>>         "x"   "z"
>>         [5,] "a"  "c"  "e"  "g"  "i"  "k" "m"  "o"  "q"  "s"   "u"  
>>         "w"   "y"
>>         [6,] "b"  "d"  "f"  "h"  "j"  "l" "n"  "p"  "r"  "t"   "v"  
>>         "x"   "z"
>>         >
>>
>>         Saludos,
>>         Carlos Ortega
>>         www.qualityexcellence.es <http://www.qualityexcellence.es>
>>
>>         El 24 de febrero de 2015, 14:10, Fernando Macedo
>>         <fermace en gmail.com <mailto:fermace en gmail.com>> escribió:
>>
>>              Excelente! Ahora corre muy rápido. No conocía ese
>>             método, creo que me va a
>>             resultar muy útil.
>>
>>             Muchas gracias y saludos.
>>
>>             Fernando Macedo
>>
>>             El 24/02/15 a las 10:51, Jorge I Velez escribió:
>>
>>              Fernando,
>>
>>              Podrias intentar
>>
>>              R> a <- rep('a', 5)
>>             R> b <- rep('b', 5)
>>             R> a
>>             [1] "a" "a" "a" "a" "a"
>>             R> b
>>             [1] "b" "b" "b" "b" "b"
>>             R> c(rbind(a, b))
>>               [1] "a" "b" "a" "b" "a" "b" "a" "b" "a" "b"
>>
>>              Saludos,
>>             Jorge.-
>>
>>
>>             2015-02-24 23:49 GMT+11:00 Fernando Macedo
>>             <fermace en gmail.com <mailto:fermace en gmail.com>>:
>>
>>             >  Buenas a todos.
>>             > Relato el problema:
>>             >
>>             > - tengo un archivo de 316 columnas por 562000 filas
>>             (aprox.).
>>             > - esas 316 columnas representan 158 sujetos, o sea dos
>>             columnas por cada
>>             > individuo conteniendo información que debe ser
>>             condensada en una sola.
>>             >
>>             > Lo que necesito es ir tomando las dos columnas de cada
>>             individuo e
>>             > intercalar los elementos de los vectores formando uno solo.
>>             >
>>             > Ejemplificando sería algo así:
>>             >
>>             > > a
>>             > [1] "a" "a" "a" "a" "a"
>>             > > b
>>             > [1] "b" "b" "b" "b" "b"
>>             > > c
>>             >  [1] "a" "b" "a" "b" "a" "b" "a" "b" "a" "b"
>>             >
>>             >
>>             > Estoy haciendo con un loop for pero es realmente muy
>>             lento. He buscado por
>>             > algún paquete que ya lo haga directamente pero no he
>>             tenido mucho éxito. Me
>>             > imagino que con sapply o apply pueda ser mucho más
>>             efectivo pero me ha
>>             > resultado complicado para entender la sintaxis de estas
>>             funciones cuando
>>             > involucra más de un objeto (vector, matriz, etc...).
>>             >
>>             > Desde ya agradezco las sugerencias que puedan verter
>>             sobre este problema.
>>             >
>>             > --
>>             > Fernando Macedo
>>             >
>>             >         [[alternative HTML version deleted]]
>>             >
>>             > _______________________________________________
>>             > R-help-es mailing list
>>             > R-help-es en r-project.org <mailto:R-help-es en r-project.org>
>>             > https://stat.ethz.ch/mailman/listinfo/r-help-es
>>             >
>>
>>                     [[alternative HTML version deleted]]
>>
>>             _______________________________________________
>>             R-help-es mailing list
>>             R-help-es en r-project.org <mailto:R-help-es en r-project.org>
>>             https://stat.ethz.ch/mailman/listinfo/r-help-es
>>
>>
>>
>>
>>         -- 
>>         Saludos,
>>         Carlos Ortega
>>         www.qualityexcellence.es <http://www.qualityexcellence.es>
>>
>>
>>
>
>
>
>
> -- 
> Saludos,
> Carlos Ortega
> www.qualityexcellence.es <http://www.qualityexcellence.es>

------------ próxima parte ------------
Se ha borrado un adjunto en formato HTML...
URL: <https://stat.ethz.ch/pipermail/r-help-es/attachments/20150821/32dd8774/attachment-0001.html>
------------ próxima parte ------------
A non-text attachment was scrubbed...
Name: no disponible
Type: image/png
Size: 77789 bytes
Desc: no disponible
URL: <https://stat.ethz.ch/pipermail/r-help-es/attachments/20150821/32dd8774/attachment-0004.png>
------------ próxima parte ------------
A non-text attachment was scrubbed...
Name: no disponible
Type: image/png
Size: 49354 bytes
Desc: no disponible
URL: <https://stat.ethz.ch/pipermail/r-help-es/attachments/20150821/32dd8774/attachment-0005.png>
------------ próxima parte ------------
A non-text attachment was scrubbed...
Name: no disponible
Type: image/png
Size: 67496 bytes
Desc: no disponible
URL: <https://stat.ethz.ch/pipermail/r-help-es/attachments/20150821/32dd8774/attachment-0006.png>
------------ próxima parte ------------
A non-text attachment was scrubbed...
Name: no disponible
Type: image/png
Size: 55630 bytes
Desc: no disponible
URL: <https://stat.ethz.ch/pipermail/r-help-es/attachments/20150821/32dd8774/attachment-0007.png>


Más información sobre la lista de distribución R-help-es