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
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" "b" "a" "b" "a" "b" "a" "b" "a" "b"
Estoy haciendo con un loop for pero es realmente muy lento. He buscado
algún paquete que ya lo haga directamente pero no he tenido mucho
imagino que con sapply o apply pueda ser mucho más efectivo pero me ha
resultado complicado para entender la sintaxis de estas funciones
involucra más de un objeto (vector, matriz, etc...).
Desde ya agradezco las sugerencias que puedan verter sobre este
--
Fernando Macedo
[[alternative HTML version deleted]]