Skip to content

[R-es] intercalar elementos de vectores

7 messages · Jorge I Velez, Fernando Macedo, Carlos Ortega

#
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í:
[1] "a" "a" "a" "a" "a"
[1] "b" "b" "b" "b" "b"
[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,

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>:

  
  
#
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>:

  
  
#
Hola,

Este otro ejemplo a partir de la idea de Jorge, de cómo procesar toda la
tabla que tienes:
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
"matIndex" y la siguiente columna "matIndex+1"
[,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ó:

  
    
#
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>:

  
  
#
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,

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ó: