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