[R-es] intercalar elementos de vectores

Jorge I Velez jorgeivanvelez en gmail.com
Mar Feb 24 15:12:23 CET 2015


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
>

	[[alternative HTML version deleted]]



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