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