<div dir="ltr"><div class="gmail_default" style="font-family:verdana,sans-serif">Hola,<br><br></div><div class="gmail_default" style="font-family:verdana,sans-serif">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).<br><br></div><div class="gmail_default" style="font-family:verdana,sans-serif">Y estos son los resultados:<br><ul><li>En mi máquina MacAir (4GB RAM - 1.3GHz Intel Core i5) :</li><ul><li>con mapply obtengo tiempos de 1.4 minutos.</li><li>con sapply se me bloqueaba RStudio.</li></ul></ul></div><div class="gmail_default" style="font-family:verdana,sans-serif">En ambos casos, iniciaba sesión "limpia" de RStudio.<br><br></div><div class="gmail_default" style="font-family:verdana,sans-serif">Para no tener problemas de máquina he probado ambos casos en la plataforma "Microsoft Azure Machine Learning" y los resultados son los siguientes:<br><ul><li>mapply: 34.862 segundos</li><li>sapply: 35.057 segundos<br></li></ul></div><div class="gmail_default" style="font-family:verdana,sans-serif">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.<br><br></div><div class="gmail_default" style="font-family:verdana,sans-serif">Adjunto capturas de pantalla del código ejecutado en cada caso y los tiempos de ejecución que proporciona la plataforma.<br></div><div class="gmail_default" style="font-family:verdana,sans-serif">En ambos casos, los tiempos incluyen la generación del data.frame equivalente (562000 x 316).<br></div><div class="gmail_default" style="font-family:verdana,sans-serif"><br><br><br><b>OPCIÓN A (MAPPLY)</b><br><br><img alt="Imágenes integradas 2" src="cid:ii_14bbd61b9b8e2327" height="482" width="530"><br><img alt="Imágenes integradas 6" src="cid:ii_14bbd712a4d8d341" height="355" width="473"><br><br><br><br><br></div><div class="gmail_default" style="font-family:verdana,sans-serif"><b>OPCIÓN B (SAPPLY)</b><br></div><div class="gmail_default" style="font-family:verdana,sans-serif"><br><br><img alt="Imágenes integradas 1" src="cid:ii_14bbd60800cfbd25" height="552" width="543"><br><br><img alt="Imágenes integradas 5" src="cid:ii_14bbd6e5737a25f4" height="433" width="558"><br></div></div><div class="gmail_extra"><br><div class="gmail_quote">El 24 de febrero de 2015, 17:12, Fernando Macedo <span dir="ltr"><<a href="mailto:fermace@gmail.com" target="_blank">fermace@gmail.com</a>></span> escribió:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div dir="ltr">
<div bgcolor="#FFFFFF" text="#000000">
<div>Muchas gracias a los dos, los ejemplos
de uso de las funciones *apply siempre son bienvenidos. <br>
<br>
Saludos <br>
<br>
<pre cols="72">Fernando Macedo
</pre>
El 24/02/15 a las 12:12, Jorge I Velez escribió:<br>
</div><div><div class="h5">
<blockquote type="cite">
<div dir="ltr">
<div class="gmail_default" style="font-family:arial,helvetica,sans-serif;font-size:small">Gracias,
Carlos.</div>
<div class="gmail_default" style="font-family:arial,helvetica,sans-serif;font-size:small"><br>
</div>
<div class="gmail_default" style="font-family:arial,helvetica,sans-serif;font-size:small">Habia
pensado en algo similar usando sapply():</div>
<div class="gmail_default" style="font-family:arial,helvetica,sans-serif;font-size:small"><br>
</div>
<div class="gmail_default" style="font-family:arial,helvetica,sans-serif;font-size:small">sapply(seq(1,
ncol(vtmp), by = 2), function(i) c(rbind(as.character(vtmp[,
i]), as.character(vtmp[, i+1]))))<br>
</div>
<div class="gmail_default" style="font-family:arial,helvetica,sans-serif;font-size:small"><br>
</div>
<div class="gmail_default" style="font-family:arial,helvetica,sans-serif;font-size:small">Dependiendo
de la dimension de los datos, quizas mapply() sea
mas eficiente que sapply().</div>
<div class="gmail_default" style="font-family:arial,helvetica,sans-serif;font-size:small"><br>
</div>
<div class="gmail_default" style="font-family:arial,helvetica,sans-serif;font-size:small">Saludos
cordiales,</div>
<div class="gmail_default" style="font-family:arial,helvetica,sans-serif;font-size:small">Jorge.-</div>
<div class="gmail_default" style="font-family:arial,helvetica,sans-serif;font-size:small"><br>
</div>
<div class="gmail_default"><br>
</div>
<div class="gmail_extra">
<div class="gmail_quote">2015-02-25 1:01 GMT+11:00 Carlos
Ortega <span dir="ltr"><<a href="mailto:cof@qualityexcellence.es" target="_blank">cof@qualityexcellence.es</a>></span>:<br>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
<div dir="ltr">
<div style="font-family:verdana,sans-serif">Hola,<br>
<br>
</div>
<div style="font-family:verdana,sans-serif">Este otro
ejemplo a partir de la idea de Jorge, de cómo procesar
toda la tabla que tienes:<br>
<br>
> #Creo un data.frame de ejemplo todo con letras<br>
> vtmp <-
as.data.frame(lapply(letters,function(x) {
rep(x,each=50) }))<br>
> names(vtmp) <- paste("col",LETTERS,sep="")<br>
> head(vtmp)<br>
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<br>
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<br>
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<br>
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<br>
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<br>
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<br>
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<br>
> <br>
> #Los números de columnas impares de mi data.frame<br>
> matIndex <- seq(1, dim(vtmp)[2], by=2)<br>
> <br>
> #Función para juntar dos columnas (idea de Jorge)<br>
> mifun <- function(x,y)
c(rbind(as.vector(vtmp[,x]),as.vector(vtmp[,y])))<br>
> <br>
> #Resulado aplicando mapply. Coge dos columnas
consecutivas y las alterna<br>
> #y así de forma iterativa para cada una de las
columnas que indica "matIndex" y la siguiente columna
"matIndex+1" <br>
> resultado <- mapply(mifun,matIndex,
matIndex+1)<br>
> head(kk)<br>
[,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9]
[,10] [,11] [,12] [,13]<br>
[1,] "a" "c" "e" "g" "i" "k" "m" "o" "q"
"s" "u" "w" "y" <br>
[2,] "b" "d" "f" "h" "j" "l" "n" "p" "r"
"t" "v" "x" "z" <br>
[3,] "a" "c" "e" "g" "i" "k" "m" "o" "q"
"s" "u" "w" "y" <br>
[4,] "b" "d" "f" "h" "j" "l" "n" "p" "r"
"t" "v" "x" "z" <br>
[5,] "a" "c" "e" "g" "i" "k" "m" "o" "q"
"s" "u" "w" "y" <br>
[6,] "b" "d" "f" "h" "j" "l" "n" "p" "r"
"t" "v" "x" "z" <br>
> <br>
<br>
</div>
<div style="font-family:verdana,sans-serif">Saludos,<br>
</div>
<div style="font-family:verdana,sans-serif">Carlos
Ortega<br>
</div>
<div style="font-family:verdana,sans-serif"><a href="http://www.qualityexcellence.es" target="_blank">www.qualityexcellence.es</a><br>
</div>
</div>
<div class="gmail_extra"><br>
<div class="gmail_quote">El 24 de febrero de 2015,
14:10, Fernando Macedo <span dir="ltr"><<a href="mailto:fermace@gmail.com" target="_blank">fermace@gmail.com</a>></span>
escribió:
<div>
<div><br>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"> Excelente! Ahora corre
muy rápido. No conocía ese método, creo que me
va a<br>
resultar muy útil.<br>
<br>
Muchas gracias y saludos.<br>
<br>
Fernando Macedo<br>
<br>
El 24/02/15 a las 10:51, Jorge I Velez escribió:<br>
<div>
<div><br>
Fernando,<br>
<br>
Podrias intentar<br>
<br>
R> a <- rep('a', 5)<br>
R> b <- rep('b', 5)<br>
R> a<br>
[1] "a" "a" "a" "a" "a"<br>
R> b<br>
[1] "b" "b" "b" "b" "b"<br>
R> c(rbind(a, b))<br>
[1] "a" "b" "a" "b" "a" "b" "a" "b" "a"
"b"<br>
<br>
Saludos,<br>
Jorge.-<br>
<br>
<br>
2015-02-24 23:49 GMT+11:00 Fernando Macedo
<<a href="mailto:fermace@gmail.com" target="_blank">fermace@gmail.com</a>>:<br>
<br>
> Buenas a todos.<br>
> Relato el problema:<br>
><br>
> - tengo un archivo de 316 columnas por
562000 filas (aprox.).<br>
> - esas 316 columnas representan 158
sujetos, o sea dos columnas por cada<br>
> individuo conteniendo información que
debe ser condensada en una sola.<br>
><br>
> Lo que necesito es ir tomando las dos
columnas de cada individuo e<br>
> intercalar los elementos de los
vectores formando uno solo.<br>
><br>
> Ejemplificando sería algo así:<br>
><br>
> > a<br>
> [1] "a" "a" "a" "a" "a"<br>
> > b<br>
> [1] "b" "b" "b" "b" "b"<br>
> > c<br>
> [1] "a" "b" "a" "b" "a" "b" "a" "b"
"a" "b"<br>
><br>
><br>
> Estoy haciendo con un loop for pero es
realmente muy lento. He buscado por<br>
> algún paquete que ya lo haga
directamente pero no he tenido mucho éxito.
Me<br>
> imagino que con sapply o apply pueda
ser mucho más efectivo pero me ha<br>
> resultado complicado para entender la
sintaxis de estas funciones cuando<br>
> involucra más de un objeto (vector,
matriz, etc...).<br>
><br>
> Desde ya agradezco las sugerencias que
puedan verter sobre este problema.<br>
><br>
> --<br>
> Fernando Macedo<br>
><br>
> [[alternative HTML version
deleted]]<br>
><br>
>
_______________________________________________<br>
> R-help-es mailing list<br>
> <a href="mailto:R-help-es@r-project.org" target="_blank">R-help-es@r-project.org</a><br>
> <a href="https://stat.ethz.ch/mailman/listinfo/r-help-es" target="_blank">https://stat.ethz.ch/mailman/listinfo/r-help-es</a><br>
><br>
<br>
[[alternative HTML version deleted]]<br>
<br>
_______________________________________________<br>
R-help-es mailing list<br>
<a href="mailto:R-help-es@r-project.org" target="_blank">R-help-es@r-project.org</a><br>
<a href="https://stat.ethz.ch/mailman/listinfo/r-help-es" target="_blank">https://stat.ethz.ch/mailman/listinfo/r-help-es</a><br>
</div>
</div>
</blockquote>
</div>
</div>
</div>
<span><font color="#888888"><br>
<br clear="all">
<br>
-- <br>
<div><span style="font-family:verdana,sans-serif">Saludos,</span><br style="font-family:verdana,sans-serif">
<span style="font-family:verdana,sans-serif">Carlos
Ortega</span><br style="font-family:verdana,sans-serif">
<span style="font-family:verdana,sans-serif"><a href="http://www.qualityexcellence.es" target="_blank">www.qualityexcellence.es</a></span></div>
</font></span></div>
</blockquote>
</div>
<br>
</div>
<div class="gmail_extra"><br>
</div>
</div>
</blockquote>
<br>
</div></div></div>
</div>
</blockquote></div><br><br clear="all"><br>-- <br><div class="gmail_signature"><span style="font-family:verdana,sans-serif">Saludos,</span><br style="font-family:verdana,sans-serif">
<span style="font-family:verdana,sans-serif">Carlos Ortega</span><br style="font-family:verdana,sans-serif">
<span style="font-family:verdana,sans-serif"><a href="http://www.qualityexcellence.es" target="_blank">www.qualityexcellence.es</a></span></div>
</div>