Hola Jorge, muchas gracias por tu pronta respuesta, no me di cuenta que
el formateo podr�a causar problemas, env�o de nuevo el c�digo sin formatos.
La idea b�sica es para un set de n�meros de columnas (desordenados) y un
set de numeros de fila el loop lo que hace es ir a la fila y columna
correspondiente de data, tomar el valor y luego hacer la media sobre esos.
data=matrix(rnorm(100*20),20,100)
col=sample(1:100,100)
t1=Sys.time()
medias=replicate(1000,{
sel=sample(1:20,10)
pareja=sample(sel,100,replace = T)
ta=Sys.time()
recep=NULL
for(i in 1:100){
n=col[i]
m=pareja[i]
c=data[m,n]
recep=c(recep,c)
}
tb=Sys.time()
media=mean(recep)
tt=tb-ta
c(media,tt)
},simplify=T)
t2=Sys.time()
diftime=(t2-t1)[[1]]
sum(medias[2,])/diftime
Fernando Macedo
El 18/03/15 a las 21:06, Jorge I Velez escribi�:
> Hola Fernando,
>
> No puedo ver las negritas, pero intuyo que lo que quieres es calcular
> la media por columnas? Si es asi, hay dos maneras:
>
> 1. Usa colMeans(x), donde "x" es tu matriz de datos
> 2. Usa apply(x, 2, mean) donde "x" es tu matriz de datos
>
> Existe una tercera pero menos conocida posibilidad que es usando el
> paquete matrixStats. Esta implementado en C en su mayoria y, de
> acuerdo con el autor, es mucho mas rapido que la familia *apply. En
> http://cran.r-project.org/web/packages/matrixStats/vignettes/matrixStats-methods.html
>
> puedes encontrar mas informacion.
>
> Saludos cordiales,
> Jorge.-
>
>
>
> 2015-03-19 11:01 GMT+11:00 Fernando Macedo <[email protected]
> <mailto:[email protected]>>:
>
> Buenas a todos. Desde hace un tiempo estoy tratando de aplicar las
> funciones de la familia *pply en todo lo que puedo, pero todav�a no es
> algo que me surja tan r�pidamente o naturalmente al momento de los
> loops
> como usar for().
> Conozco las ventajas de usar estas funciones y por eso mi intento de
> hacerme de ellas.
>
> Por ejemplo en este problema:
>
> data=matrix(rnorm(100*20),20,100)
> col=sample(1:100,100)
>
> t1=Sys.time()
>
> medias=replicate(1000,{
> sel=sample(1:20,10)
> pareja=sample(sel,100,replace = T)
> ta=Sys.time()
> *recep=NULL**
> ** for(i in 1:100){**
> ** n=col[i]**
> ** m=pareja[i]**
> ** c=data[m,n]**
> ** recep=c(recep,c)**
> ** }**
> * tb=Sys.time()
> media=mean(recep)
> tt=tb-ta
> c(media,tt)
> })
>
> t2=Sys.time()
>
> diftime=(t2-t1)[[1]]
>
> sum(medias[2,])/diftime
>
>
> la parte que est� en negrita (si us� bien los Sys.time()) me
> representa
> (hice varias pruebas) aprox un 60% del tiempo total empleado.
>
> Mi pregunta es, para este ejemplo �c�mo plantear�an una soluci�n
> usando
> funciones *pply?
> Y luego ver cuanto aumenta en el rendimiento del uso del tiempo.
>
> De paso, la salida que obtengo es una matriz de 2 por 1000, cuando
> ser�a
> m�s interesante una matriz de 1000 por 2. Si se usa simplify = F como
> argumento de replicate() resulta en una lista. �Existe alg�n argumento
> que directamente obtenga una matriz de 1000 por 2? (Esto �ltimo
> pensando
> en de repente 100000 o 1000000 de repeticiones y salidas m�s
> complejas).
>
>
> Saludos!
>
> --
> Fernando Macedo
>
>
> [[alternative HTML version deleted]]
>
> _______________________________________________
> R-help-es mailing list
> [email protected] <mailto:[email protected]>
> https://stat.ethz.ch/mailman/listinfo/r-help-es
>
>
[[alternative HTML version deleted]]
_______________________________________________
R-help-es mailing list
[email protected]
https://stat.ethz.ch/mailman/listinfo/r-help-es