Yo lo pasaría a data.table ... es más eficiente administrando datos. Y analizar si se puede usar furrr. Si no funciona, siempres está el buen RCPP
Saludos. El jue, 23 de sep. de 2021 a la(s) 13:11, <r-help-es-requ...@r-project.org> escribió: > Envíe los mensajes para la lista R-help-es a > r-help-es@r-project.org > > Para subscribirse o anular su subscripción a través de la WEB > https://stat.ethz.ch/mailman/listinfo/r-help-es > > O por correo electrónico, enviando un mensaje con el texto "help" en > el asunto (subject) o en el cuerpo a: > r-help-es-requ...@r-project.org > > Puede contactar con el responsable de la lista escribiendo a: > r-help-es-ow...@r-project.org > > Si responde a algún contenido de este mensaje, por favor, edite la > linea del asunto (subject) para que el texto sea mas especifico que: > "Re: Contents of R-help-es digest...". Además, por favor, incluya en > la respuesta sólo aquellas partes del mensaje a las que está > respondiendo. > Asuntos del día: > > 1. Re: problema de tiempo de ejecución con una rutina dentro de > un programa de R (Carlos Santos) > 2. Re: problema de tiempo de ejecución con una rutina dentro de > un programa de R (Carlos Santos) > 3. Re: problema de tiempo de ejecución con una rutina dentro de > un programa de R (Carlos Santos) > > > ---------- Forwarded message ---------- > From: Carlos Santos <carlossantos....@gmail.com> > To: Lista R <r-help-es@r-project.org> > Cc: > Bcc: > Date: Thu, 23 Sep 2021 17:10:41 +0200 > Subject: Re: [R-es] problema de tiempo de ejecución con una rutina dentro > de un programa de R > Hola de nuevo, nadie tiene alguna idea que pueda ayudarme?, alguna > sugerencia posible? cualquier cosa me puede ayudar por favor. > muchas gracias > > > > > > El mié, 22 sept 2021 a las 18:34, Carlos Santos (< > carlossantos....@gmail.com>) > escribió: > > > ok Carlos, pongo un ejemplo con pocos registros a ver si puedo explicarlo > > mejor: > > > > Datos: > > V0 V1 V2 V3 V4 V5 V6 V7 V8 V9 V10 > > 1 63 1 1 145 A 233 1 2 3 0 > > 2 67 1 4 160 A 286 0 2 2 3 > > 3 67 2 4 120 B 229 0 2 2 2 > > 4 37 1 3 130 C 250 0 0 3 0 > > 5 41 1 2 130 C 204 0 2 1 0 > > 6 56 2 2 120 A 236 0 0 1 0 > > 7 62 1 4 140 B 268 0 2 3 2 > > 8 57 2 4 120 C 354 0 0 1 0 > > 9 63 2 4 130 A 254 0 2 2 1 > > 10 53 1 4 140 B 203 1 2 3 0 > > 11 57 2 4 140 B 192 0 0 2 0 > > 12 56 1 2 140 A 294 0 2 2 0 > > 13 56 2 3 130 C 256 1 2 2 1 > > 14 44 2 2 120 B 263 0 0 1 0 > > 15 52 2 3 172 B 199 1 0 1 0 > > > > tengo la matriz que sale de V5: > > A > > B > > C > > > > junto las filas de A con B, y obtengo el punto respecto de V2, y me da > > (0.33, 0.67), puesto que V2 tiene dos valores, es un porcentaje en > > definitiva > > junto las filas de A con C, y se obtiene el punto (0.5, 0.5) > > obtengo la distancia euclidea de dichos puntos sobre el punto definido, > > supongamos (0.34, 066), lo que significa que la menor distancia se > obtiene > > entre A y B, por lo tanto las filas que tienen A en V5 se cambia su > valor a > > C, y se obtiene la siguiente matriz, donde V5 ya no tiene la A > > V0 V1 V2 V3 V4 V5 V6 V7 V8 V9 V10 > > 1 63 1 1 145 C 233 1 2 3 0 > > 2 67 1 4 160 C 286 0 2 2 3 > > 3 67 2 4 120 B 229 0 2 2 2 > > 4 37 1 3 130 C 250 0 0 3 0 > > 5 41 1 2 130 C 204 0 2 1 0 > > 6 56 2 2 120 C 236 0 0 1 0 > > 7 62 1 4 140 B 268 0 2 3 2 > > 8 57 2 4 120 C 354 0 0 1 0 > > 9 63 2 4 130 C 254 0 2 2 1 > > 10 53 1 4 140 B 203 1 2 3 0 > > 11 57 2 4 140 B 192 0 0 2 0 > > 12 56 1 2 140 C 294 0 2 2 0 > > 13 56 2 3 130 C 256 1 2 2 1 > > 14 44 2 2 120 B 263 0 0 1 0 > > 15 52 2 3 172 B 199 1 0 1 0 > > en este ejemplo el while seria 2, es decir que se pararía puesto que solo > > tengo dos valore en V5 > > > > Evidentemente cuando tengo 100.000 filas con 100 columnas y tengo la > > matriz intermedia que he puesto en este ejemplo con letras de 2000 filas, > > puesto no veo como consumir menos tiempo de ejecucion. > > > > espero que lo haya podido explicar mejor con este ejemplo. > > > > gracias de antemano Carlos > > > > El mié, 22 sept 2021 a las 17:48, Carlos Ortega (< > c...@qualityexcellence.es>) > > escribió: > > > >> Vaya me cuesta verlo... :-)... > >> > >> ¿Puedes poner un ejemplo con números con los diferentes vectores con los > >> que partes y cómo vas rellenando esa matriz? > >> Y cómo quedaría al final.. > >> > >> Gracias! > >> Carlos. > >> > >> El mié, 22 sept 2021 a las 16:01, Carlos Santos (< > >> carlossantos....@gmail.com>) escribió: > >> > >>> jajajaja, perdón no te había entendido, lo siento > >>> > >>> a ver, de esta forma y para que sea fácil, supongamos esta matriz, > >>> evidentemente el problema lo tengo cuando esta matriz es muy grande > claro. > >>> G1 > >>> G2 > >>> G3 > >>> G4 > >>> G5 > >>> G6 > >>> G7 > >>> G8 > >>> G9 > >>> G10 > >>> El while lo puse porque quite el for que tenia al principio para no > >>> poner muchos FOR anidados, por lo tanto el while va a ejecutar el FOR > >>> siguiente 7 veces > >>> > >>> El FOR lo que hace es ejecutarse 9 veces la primera vez, y agrupa los > >>> registros de G1 con cada uno de los otros grupos individualmente, > calcula > >>> el porcentaje de elementos de cada nuevo grupo respecto a una de las > >>> variables del registro, por ejemplo supongamos que la variable tiene 2 > >>> valores, obtenemos un punto (X,Y) que representa el porcentaje de cada > >>> valor que tiene la variable dentro de su nuevo grupo > >>> Lo mismo para el resto de nuevos grupos, y se calcula la distancia > >>> euclidea entre cada nuevo punto respecto de un punto predefinido. > >>> > >>> a continuación se haría tomando G2 con el resto descendente, y así > >>> sucesivamente hasta que el while ejecute en este ejemplo 7 veces = 10-3 > >>> > >>> Quizas asi este mas claro, Carlos > >>> > >>> > >>> > >>> > >>> > >>> El mié, 22 sept 2021 a las 15:43, Carlos Ortega (< > >>> c...@qualityexcellence.es>) escribió: > >>> > >>>> Hola Carlos, > >>>> > >>>> Sí, si lo he entendido así. > >>>> > >>>> Lo que te propongo es que nos cuentes qué quieres hacer con esos dos > >>>> bucles o un bucle y un while. Porque a lo mejor se puede plantear otra > >>>> aproximación para actualizar cada elemento de la matriz. > >>>> > >>>> Gracias, > >>>> Carlos. > >>>> > >>>> El mié, 22 sept 2021 a las 15:31, Carlos Santos (< > >>>> carlossantos....@gmail.com>) escribió: > >>>> > >>>>> Gracias Carlos, > >>>>> > >>>>> Si, quizas no lo explique bien, lo fundamental y es donde se tarda > >>>>> mucho tiempod e cpu, es el bucle FOR, que tiene que recorrer una > matriz > >>>>> desde 1 hasta totcluy, entendiendo que la variable totclu puede ser > por > >>>>> ejemplo 10.000, lo que quiere decir que por cada fila tiene que > realizar el > >>>>> calculo que he puesto en el FOR que tampoco es demasiado pero > logicamente > >>>>> tiene que recorrer por ejemplo en este caso 10.000 columnas > >>>>> A su vez el while tiene que hacerlo otras 10000 veces menos 3, lo que > >>>>> significa que el tiempo empleado hasta completar cada fila de la > matriz es > >>>>> enorme > >>>>> > >>>>> no se si he podido explicarlo mejor, es por eso que entiendo que el > >>>>> bucle FOR es muy costoso, y aunque he puesto un while bien podia ser > un FOR > >>>>> dentro de otro FOR, en donde el primero controla las filas y el > segundo las > >>>>> columnas, pero no se como hacer que el tiempo de cpu sea lo menor > posible > >>>>> > >>>>> El mié, 22 sept 2021 a las 14:56, Carlos Ortega (< > >>>>> c...@qualityexcellence.es>) escribió: > >>>>> > >>>>>> Hola, > >>>>>> > >>>>>> ¿Por qué no nos dices mejor el problema qué quieres resolver con tus > >>>>>> datos/matriz/matrices inicial? > >>>>>> Seguramente podamos ver una forma alternativa a utilizar un bucle... > >>>>>> > >>>>>> En cualquier caso, por si quieres ir viendo como correr ese bucle en > >>>>>> paralelo..: > >>>>>> > >>>>>> - > >>>>>> > https://stackoverflow.com/questions/53054366/how-can-i-run-a-for-loop-in-parallel-in-r > >>>>>> > >>>>>> Saludos, > >>>>>> Carlos Ortega > >>>>>> www.qualityexcellence.es > >>>>>> > >>>>>> El mié, 22 sept 2021 a las 13:18, Carlos Santos (< > >>>>>> carlossantos....@gmail.com>) escribió: > >>>>>> > >>>>>>> Hola a todos, familia de R > >>>>>>> > >>>>>>> Tengo un pequeño problema de tiempo de ejecución con una rutina, a > >>>>>>> ver si > >>>>>>> me pueden echar una mano y ayudarme si es posible, claro. > >>>>>>> > >>>>>>> La rutina es la siguiente: > >>>>>>> > >>>>>>> while(totclu != 3){ > >>>>>>> matrizF <- matrix(0, nrow = 1, ncol = totclu) > >>>>>>> for (j in 1:totclu) { > >>>>>>> q1 <- c(which(data1$Clus.Multi.FAIRNESS == k2A$Var1[1]), > >>>>>>> which(data1$Clus.Multi.FAIRNESS == k2A$Var1[j])) > >>>>>>> q2 <- nrow(as.data.frame(c(which(data1$Clus.Multi.FAIRNESS == > >>>>>>> k2A$Var1[1]), > >>>>>>> which(data1$Clus.Multi.FAIRNESS == > >>>>>>> k2A$Var1[j])))) > >>>>>>> observado <- table(data1$VarFC[q1])/q2 > >>>>>>> matrizF[i] <- dist(rbind(observado,propuesto),method = > >>>>>>> "euclidean") > >>>>>>> } > >>>>>>> matrizF[1] <- 99 > >>>>>>> min_observado <- which.min(matrizF) > >>>>>>> q4 <- which(data1$Clus.Multi.FAIRNESS == k2A$Var1[1]) > >>>>>>> data1$Clus.Multi.FAIRNESS[q4] <- > >>>>>>> as.character(k2A$Var1[min_observado]) > >>>>>>> k2A$Freq[min_observado] <- k2A$Freq[min_observado] + k2A$Freq[1] > >>>>>>> k2A <- > >>>>>>> as.data.frame(table(as.character(data1$Clus.Multi.FAIRNESS))) %>% > >>>>>>> arrange(Freq) > >>>>>>> totclu=nrow(k2A) > >>>>>>> } > >>>>>>> > >>>>>>> El problema fundamental es que la matriz que aparece como k2A es > una > >>>>>>> matriz > >>>>>>> (nxn) lo que significa que puede ser muy grande, por ejemplo > >>>>>>> 1000x1000, y > >>>>>>> el tiempo que tarda es enorme y no veo como disminuir el tiempo de > >>>>>>> ejecución del "for" que pienso que es lo mas duro. > >>>>>>> > >>>>>>> No se si se puede poner como procesamiento en paralelo en r, pero > >>>>>>> tampoco > >>>>>>> ser como ponerlo > >>>>>>> > >>>>>>> Si me pueden echar una mano, les estaré muy agradecido > >>>>>>> > >>>>>>> muchas gracias de antemano > >>>>>>> > >>>>>>> Carlos Santos > >>>>>>> > >>>>>>> [[alternative HTML version deleted]] > >>>>>>> > >>>>>>> _______________________________________________ > >>>>>>> R-help-es mailing list > >>>>>>> R-help-es@r-project.org > >>>>>>> https://stat.ethz.ch/mailman/listinfo/r-help-es > >>>>>>> > >>>>>> > >>>>>> > >>>>>> -- > >>>>>> Saludos, > >>>>>> Carlos Ortega > >>>>>> www.qualityexcellence.es > >>>>>> > >>>>> > >>>> > >>>> -- > >>>> Saludos, > >>>> Carlos Ortega > >>>> www.qualityexcellence.es > >>>> > >>> > >> > >> -- > >> Saludos, > >> Carlos Ortega > >> www.qualityexcellence.es > >> > > > > [[alternative HTML version deleted]] > > > > > > ---------- Forwarded message ---------- > From: Carlos Santos <carlossantos....@gmail.com> > To: Carlos Ortega <c...@qualityexcellence.es> > Cc: Lista R <r-help-es@r-project.org> > Bcc: > Date: Thu, 23 Sep 2021 20:00:35 +0200 > Subject: Re: [R-es] problema de tiempo de ejecución con una rutina dentro > de un programa de R > Gracias Carlos, lo has entendido perfectamente > > El punto definido que he puesto, no siempre tendrá esos mismos valores, > > La columna V5 no siempre tendrá los mismos valores, pero puede valerme que > siempre tenga el mismo nombre de columna, por si eso puede ayudar, ya que > se puede cambiar el nombre de columna antes de llegar a esa rutina si fuese > necesario para que la rutina funcione mejor > > > > El jue., 23 sept. 2021 19:49, Carlos Ortega <c...@qualityexcellence.es> > escribió: > > > Gracias Carlos! > > > > Que no dije nada.... :-). > > Creo que ya lo entiendo pero no he podido meterme con ello.. > > A ver si mañana o este fin de semana encuentro un hueco para ver qué se > me > > ocurre. > > > > Un par de dudas adicionales que me surgieron al ver el detalle de tu > > respuesta: > > > > - ¿Para el cálculo se usa siempre esa columna "V5" que es la que tiene > > las letras?. > > - Y claro el objetivo al final es que queda solo una letra tras entrar > > a comparar todas las parejas posibles,¿es así?. > > - Y eso de la distancia a ese punto definido... > > - El punto definido ¿es siempre que has indicado? (0.34, 0.66)?. > > > > > > Así, de primeras lo que veo es porqué hacen falta dos bucles o un bucle y > > un while. > > Parece más un proceso recursivo: comienzas con todos los pare de parejas, > > reduces y vuelves a aplicar el proceso de comparación con las que quedan. > > Por eso lo de aclarar la duda del primer punto anterior. > > > > Gracias, > > Carlos. > > > > El mié, 22 sept 2021 a las 18:38, Carlos Santos (< > > carlossantos....@gmail.com>) escribió: > > > >> Perdón he puesto 2000 columnas pero quería decir 2000 filas > >> > >> El mié., 22 sept. 2021 18:34, Carlos Santos <carlossantos....@gmail.com > > > >> escribió: > >> > >>> ok Carlos, pongo un ejemplo con pocos registros a ver si puedo > >>> explicarlo mejor: > >>> > >>> Datos: > >>> V0 V1 V2 V3 V4 V5 V6 V7 V8 V9 V10 > >>> 1 63 1 1 145 A 233 1 2 3 0 > >>> 2 67 1 4 160 A 286 0 2 2 3 > >>> 3 67 2 4 120 B 229 0 2 2 2 > >>> 4 37 1 3 130 C 250 0 0 3 0 > >>> 5 41 1 2 130 C 204 0 2 1 0 > >>> 6 56 2 2 120 A 236 0 0 1 0 > >>> 7 62 1 4 140 B 268 0 2 3 2 > >>> 8 57 2 4 120 C 354 0 0 1 0 > >>> 9 63 2 4 130 A 254 0 2 2 1 > >>> 10 53 1 4 140 B 203 1 2 3 0 > >>> 11 57 2 4 140 B 192 0 0 2 0 > >>> 12 56 1 2 140 A 294 0 2 2 0 > >>> 13 56 2 3 130 C 256 1 2 2 1 > >>> 14 44 2 2 120 B 263 0 0 1 0 > >>> 15 52 2 3 172 B 199 1 0 1 0 > >>> > >>> tengo la matriz que sale de V5: > >>> A > >>> B > >>> C > >>> > >>> junto las filas de A con B, y obtengo el punto respecto de V2, y me da > >>> (0.33, 0.67), puesto que V2 tiene dos valores, es un porcentaje en > >>> definitiva > >>> junto las filas de A con C, y se obtiene el punto (0.5, 0.5) > >>> obtengo la distancia euclidea de dichos puntos sobre el punto definido, > >>> supongamos (0.34, 066), lo que significa que la menor distancia se > obtiene > >>> entre A y B, por lo tanto las filas que tienen A en V5 se cambia su > valor a > >>> C, y se obtiene la siguiente matriz, donde V5 ya no tiene la A > >>> V0 V1 V2 V3 V4 V5 V6 V7 V8 V9 V10 > >>> 1 63 1 1 145 C 233 1 2 3 0 > >>> 2 67 1 4 160 C 286 0 2 2 3 > >>> 3 67 2 4 120 B 229 0 2 2 2 > >>> 4 37 1 3 130 C 250 0 0 3 0 > >>> 5 41 1 2 130 C 204 0 2 1 0 > >>> 6 56 2 2 120 C 236 0 0 1 0 > >>> 7 62 1 4 140 B 268 0 2 3 2 > >>> 8 57 2 4 120 C 354 0 0 1 0 > >>> 9 63 2 4 130 C 254 0 2 2 1 > >>> 10 53 1 4 140 B > >>> > >> > > [[alternative HTML version deleted]] > > > > > > ---------- Forwarded message ---------- > From: Carlos Santos <carlossantos....@gmail.com> > To: Carlos Ortega <c...@qualityexcellence.es> > Cc: Lista R <r-help-es@r-project.org> > Bcc: > Date: Thu, 23 Sep 2021 20:08:21 +0200 > Subject: Re: [R-es] problema de tiempo de ejecución con una rutina dentro > de un programa de R > Exacto, eso es Carlos > > El jue., 23 sept. 2021 20:04, Carlos Ortega <c...@qualityexcellence.es> > escribió: > > > OK. Gracias. > > > > Sí, bueno lo del nombre de V5 o el que sea efectivamente da igual, ¿pero > > es siempre una única columna por la que hay que agrupar?. > > Y luego en esa columna ¿se ha de iterar hasta que quede solo una letra? > > (letra o el factor que sea). > > > > Gracias! > > Carlos. > > > > El jue, 23 sept 2021 a las 20:00, Carlos Santos (< > > carlossantos....@gmail.com>) escribió: > > > >> Gracias Carlos, lo has entendido perfectamente > >> > >> El punto definido que he puesto, no siempre tendrá esos mismos valores, > >> > >> La columna V5 no siempre tendrá los mismos valores, pero puede valerme > >> que siempre tenga el mismo nombre de columna, por si eso puede ayudar, > ya > >> que se puede cambiar el nombre de columna antes de llegar a esa rutina > si > >> fuese necesario para que la rutina funcione mejor > >> > >> > >> > >> El jue., 23 sept. 2021 19:49, Carlos Ortega <c...@qualityexcellence.es> > >> escribió: > >> > >>> Gracias Carlos! > >>> > >>> Que no dije nada.... :-). > >>> Creo que ya lo entiendo pero no he podido meterme con ello.. > >>> A ver si mañana o este fin de semana encuentro un hueco para ver qué se > >>> me ocurre. > >>> > >>> Un par de dudas adicionales que me surgieron al ver el detalle de tu > >>> respuesta: > >>> > >>> - ¿Para el cálculo se usa siempre esa columna "V5" que es la que > >>> tiene las letras?. > >>> - Y claro el objetivo al final es que queda solo una letra tras > >>> entrar a comparar todas las parejas posibles,¿es así?. > >>> - Y eso de la distancia a ese punto definido... > >>> - El punto definido ¿es siempre que has indicado? (0.34, 0.66)?. > >>> > >>> > >>> Así, de primeras lo que veo es porqué hacen falta dos bucles o un bucle > >>> y un while. > >>> Parece más un proceso recursivo: comienzas con todos los pare de > >>> parejas, reduces y vuelves a aplicar el proceso de comparación con las > que > >>> quedan. > >>> Por eso lo de aclarar la duda del primer punto anterior. > >>> > >>> Gracias, > >>> Carlos. > >>> > >>> El mié, 22 sept 2021 a las 18:38, Carlos Santos (< > >>> carlossantos....@gmail.com>) escribió: > >>> > >>>> Perdón he puesto 2000 columnas pero quería decir 2000 filas > >>>> > >>>> El mié., 22 sept. 2021 18:34, Carlos Santos < > carlossantos....@gmail.com> > >>>> escribió: > >>>> > >>>>> ok Carlos, pongo un ejemplo con pocos registros a ver si puedo > >>>>> explicarlo mejor: > >>>>> > >>>>> Datos: > >>>>> V0 V1 V2 V3 V4 V5 V6 V7 V8 V9 V10 > >>>>> 1 63 1 1 145 A 233 1 2 3 0 > >>>>> 2 67 1 4 160 A 286 0 2 2 3 > >>>>> 3 67 2 4 120 B 229 0 2 2 2 > >>>>> 4 37 1 3 130 C 250 0 0 3 0 > >>>>> 5 41 1 2 130 C 204 0 2 1 0 > >>>>> 6 56 2 2 120 A 236 0 0 1 0 > >>>>> 7 62 1 4 140 B 268 0 2 3 2 > >>>>> 8 57 2 4 120 C 354 0 0 1 0 > >>>>> 9 63 2 4 130 A 254 0 2 2 1 > >>>>> 10 53 1 4 140 B 203 1 2 3 0 > >>>>> 11 57 2 4 140 B 192 0 0 2 0 > >>>>> 12 56 1 2 140 A 294 0 2 2 0 > >>>>> 13 56 2 3 130 C 256 1 2 2 1 > >>>>> 14 44 2 2 120 B 263 0 0 1 0 > >>>>> 15 52 2 3 172 B 199 1 0 1 0 > >>>>> > >>>>> tengo la matriz que sale de V5: > >>>>> A > >>>>> B > >>>>> C > >>>>> > >>>>> junto las filas de A con B, y obtengo el punto respecto de V2, y me > da > >>>>> (0.33, 0.67), puesto que V2 tiene dos valores, es un porcentaje en > >>>>> definitiva > >>>>> junto las filas de A con C, y se obtiene el punto (0.5, 0.5) > >>>>> obtengo la distancia euclidea de dichos puntos sobre el punto > >>>>> definido, supongamos (0.34, 066), lo que significa que la menor > distancia > >>>>> se obtiene entre A y B, por lo tanto las filas que tienen A en V5 se > cambia > >>>>> su valor a C, y se obtiene la siguiente matriz, donde V5 ya no tiene > la A > >>>>> V0 V1 V2 V3 V4 V5 V6 V7 V8 V9 V10 > >>>>> 1 63 1 1 145 C 233 1 2 3 0 > >>>>> 2 67 1 4 160 C 286 0 2 2 3 > >>>>> 3 67 2 4 120 B 229 0 2 2 2 > >>>>> 4 37 1 3 130 C 250 0 0 3 0 > >>>>> 5 41 1 2 130 C 204 0 2 1 0 > >>>>> 6 56 2 2 120 C 236 0 0 1 0 > >>>>> 7 62 1 4 140 B 268 0 2 3 2 > >>>>> 8 57 2 4 120 C 354 0 0 1 0 > >>>>> 9 63 2 4 130 C 254 0 2 2 > >>>>> > >>>> > > [[alternative HTML version deleted]] > > > _______________________________________________ > R-help-es mailing list > R-help-es@r-project.org > https://stat.ethz.ch/mailman/listinfo/r-help-es > [[alternative HTML version deleted]] _______________________________________________ R-help-es mailing list R-help-es@r-project.org https://stat.ethz.ch/mailman/listinfo/r-help-es