[R-es] intercalar elementos de vectores

Carlos Ortega cof en qualityexcellence.es
Mar Feb 24 22:28:21 CET 2015


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) :
      - con mapply obtengo tiempos de 1.4 minutos.
      - 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)*

[image: Imágenes integradas 2]
[image: Imágenes integradas 6]




*OPCIÓN B (SAPPLY)*


[image: Imágenes integradas 1]

[image: Imágenes integradas 5]

El 24 de febrero de 2015, 17:12, Fernando Macedo <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>:
>
>>  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
>>
>> El 24 de febrero de 2015, 14:10, Fernando Macedo <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>:
>>>
>>> >  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
>>> > 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
>>> https://stat.ethz.ch/mailman/listinfo/r-help-es
>>>
>>
>>
>>
>> --
>> Saludos,
>> Carlos Ortega
>> www.qualityexcellence.es
>>
>
>
>
>


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


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