[R-es] Como puedo reducir el tiempo de ejecución en la siguiente rutina

Carlos Santos c@r|o@@@nto@@c@m @end|ng |rom gm@||@com
Lun Dic 14 12:24:54 CET 2020


gracias por tus comentarios.

lo que dices es asi, excepto cuando hay varios máximos iguales entonces se
ejecuta f5 para saber cual de ellos es el elegido, y a continuación se hace
lo mismo que has puesto en la frase, es decir elegir el valor de la columna
var que ocupa dicha posición del elegido

gracias de todas formas, cualquier ayuda y comentario es de agradecer




El lun, 14 dic 2020 a las 12:05, <l.graco using pm.me> escribió:

> Te quería echar una mano pero no veo el objetivo del proceso.
>
> A ver si lo voy entendiendo: "Supongamos que tenemos esta matriz, se
> quiere conseguir para el mayor valor por fila tomar el valor de la posición
> que ocupa la primera columna "Var" en base a la columna elegida y si hay
> varios valores máximos iguales, entonces ejecutar la función "f5" para
> elegir una y según valor máximo obtenido proceder de la misma manera que
> antes."
>
> ¿Con eso quieres decir que buscas en la fila el valor máximo de las
> columnas MX... (supongamos que es la columna MZ) y seleccionas el valor de
> la columna var que ocupa dicha posición (la posición Z en este caso?. ¿Y en
> caso de varios máximos eliges una de las columnas candidatas mediante la
> función f5?. Y esa función f5 contiene una llamada a cohend, nada más.
>
> No sé, no acabo de entender la lógica de todo el proceso. Pero así, a
> oscuras, data.table es más eficiente manejando grandes volúmenes de datos y
> hacer un repeat tal vez no sea lo más rápido, sino aplicar vectorización
> allá donde se pueda.
>
> Siento no poder ayudar más. Ánimo.
>
> ‐‐‐‐‐‐‐ Original Message ‐‐‐‐‐‐‐
>
> El lunes, 14 de diciembre de 2020 a las 10:31, Carlos Santos <
> carlossantos.csm using gmail.com> escribió:
>
> > gracias Emilio por tu ayuda, la selección es por fila, no por variable
> >
> > He intentado discriminar cuando solo encuentra una posición en la fila
> que
> >
> > es el máximo, pero el ahorro de tiempo no es mucho aunque algo es algo
> >
> > Creo que el tiempo se consume en la parte del ELSE, y aunque entiendo que
> >
> > se tiene que leer toda la matriz fila a fila, no veo cómo hacer que
> consuma
> >
> > menos tiempo
> >
> > Solo me quedaría probar dividir la matriz en trozos, para ver si en
> proceso
> >
> > paralelo podría consumir menos tiempo, ya que cada fila es independiente
> de
> >
> > otra fila.
> >
> > if (smc == 1) {
> >
> > data1$Clus.Multi.OPTIMO[fila] <-
> >
> > data1$Clus.Multi.MAX[max(data2[fila,(3:(rr+2))])]
> >
> > } else {
> >
> > RECEPTOR$clus <-
> >
> >
> data2[which(as.vector(t(data2[fila,])[,1])==max(data2[fila,(3:(rr+2))]))-2,1][1]$Var
> >
> > RECEPTOR$dist <- mclapply((1:smc),f5) %>% unlist()
> >
> >     data1$Clus.Multi.OPTIMO[which(data1$Clus.Multi.MAX == EMISOR)] <-
> >
> >
> > RECEPTOR[which.max(RECEPTOR[,2]),1]
> >
> > }
> >
> > Muchas gracias de nuevo Emilio
> >
> > Un saludo
> >
> > El lun, 14 dic 2020 a las 8:08, Emilio L. Cano (emilopezcano using gmail.com)
> >
> > escribió:
> >
> > > Hola,
> > >
> > > Para la primera parte (seleccionar los valores más altos de una
> variable)
> > >
> > > yo usaría dplyr::slice_max(). Creo que eso debería ser rápido y con el
> > >
> > > filtro hecho lo demás debería ser trivial. Si he entendido bien el
> problema.
> > >
> > > Un saludo,
> > >
> > > Emilio
> > >
> > > El 13 dic 2020, a las 15:31, Carlos Santos carlossantos.csm using gmail.com
> > >
> > > escribió:
> > >
> > > Perdón Carlos, con las prisas se me olvidó por completo añadir lo que
> > >
> > > > faltaba, tienes toda la razón
> > > >
> > > > Supongamos que tenemos esta matriz, se quiere conseguir para el mayor
> > > >
> > > > valor por fila tomar el valor de la posición que ocupa la primera
> > > >
> > > > columna "Var" en base a la columna elegida y si hay varios valores
> > > >
> > > > máximos iguales, entonces ejecutar la función "f5" para elegir una y
> > > >
> > > > según valor máximo obtenido proceder de la misma manera que antes.
> > > >
> > > > El problema es cuando tengo matrices de 3000x3000 o 10000x10000, y
> > > >
> > > > además los dígitos de la columna primera son superiores al puesto en
> este
> > > >
> > > > ejemplo, entonces el tiempo de calculo es excesivo.
> > > >
> > > > <image.png>
> > > >
> > > > codigo:
> > >
> > > > f5 <- function(x){data1 %>% filter(Clus.Multi.OPTIMO %in%
> > > >
> > > > c(EMISOR,RECEPTOR[x])) %>%
> > > >
> > > > dplyr::select(1:numvar+1) %>% data.matrix() %>% CohenD()}
> > > >
> > > > fila = 1
> > > >
> > > > rr = nrow(data2)
> > > >
> > > > data1 <- data1 %>% mutate(Clus.Multi.OPTIMO=Clus.Multi.MAX)
> > > >
> > > > repeat{
> > > >
> > > > smc <-
> > > >
> > > >
> sum(data2[fila,((2+fila):(nrow(data2)+2))]==max(data2[fila,((2+fila):(nrow(data2)+2))]))
> > > >
> > > > EMISOR <- data2[fila,1]$Var
> > > >
> > > > RECEPTOR <-
> > > >
> > > >
> data2[which(as.vector(t(data2[fila,])[,1])==max(data2[fila,((2+fila):(nrow(data2)+2))]))-2,1]$Var
> > > >
> > > > Rmax <- RECEPTOR[mclapply((1:smc),f5) %>% unlist() %>% which.max()]
> > > >
> > > > data1$Clus.Multi.OPTIMO[which(data1$Clus.Multi.MAX ==
> > > >
> > > > data2[fila,1]$Var)] <- Rmax
> > > >
> > > > fila = fila + 1
> > > >
> > > > if (fila == rr) {break}
> > > >
> > > > }
> > >
> > > >
> https://www.avast.com/sig-email?utm_medium=email&utm_source=link&utm_campaign=sig-email&utm_content=webmail
> Libre
> > > >
> > > > de virus. www.avast.com
> > > >
> > > >
> https://www.avast.com/sig-email?utm_medium=email&utm_source=link&utm_campaign=sig-email&utm_content=webmail
> > > >
> > > > El dom, 13 dic 2020 a las 12:49, Carlos Ortega (
> cof using qualityexcellence.es)
> > > >
> > > > escribió:
> > > >
> > > > > Hola,
> > > > >
> > > > > Mejor si pones un ejemplo de tu matriz y cuentas lo que quieres
> hacer...
> > > > >
> > > > > El enfoque puede ser muy diferente al que has planteado.
> > > > >
> > > > > Gracias,
> > > > >
> > > > > Calros Ortega
> > > > >
> > > > > www.qualityexcellence.es
> > > > >
> > > > > El dom, 13 dic 2020 a las 12:33, Carlos Santos (<
> > > > >
> > > > > carlossantos.csm using gmail.com>) escribió:
> > > > >
> > > > > > Buen dia,
> > > > > >
> > > > > > Tengo un problema cuando ejecuto la siguiente rutina, porque con
> una
> > > > > >
> > > > > > matriz
> > > > > >
> > > > > > muy grande el tiempo de ejecución se va a bastantes horas.
> > > > > >
> > > > > > Cualquier idea para mejorarlo y reducir significativamente el
> tiempo,
> > > > > >
> > > > > > estaría muy agradecido
> > > > > >
> > > > > > Muchas gracias por vuestra ayuda
> > > > > >
> > > > > >
> #_____________________________________________________________________________________
> > > > > >
> > > > > > f5 <- function(x){data1 %>% filter(Clus.Multi.OPTIMO %in%
> > > > > >
> > > > > > c(EMISOR,RECEPTOR[x])) %>%
> > > > > >
> > > > > > dplyr::select(1:numvar+1) %>% data.matrix() %>% CohenD()}
> > > > > >
> > > > > > fila = 1
> > > > > >
> > > > > > rr = nrow(data2)
> > > > > >
> > > > > > repeat{
> > > > > >
> > > > > > smc <-
> > > > > >
> > > > > >
> sum(data2[fila,((2+fila):(nrow(data2)+2))]==max(data2[fila,((2+fila):(nrow(data2)+2))]))
> > > > > >
> > > > > > EMISOR <- data2[fila,1]$Var
> > > > > >
> > > > > > RECEPTOR <-
> > > > > >
> > > > > >
> data2[which(as.vector(t(data2[fila,])[,1])==max(data2[fila,((2+fila):(nrow(data2)+2))]))-2,1]$Var
> > > > > >
> > > > > >     Rmax <- RECEPTOR[mclapply((1:smc),f5) %>% unlist() %>%
> which.max()]
> > > > > >
> > > > > >     data1$Clus.Multi.OPTIMO[which(data1$Clus.Multi.MAX ==
> > > > > >
> > > > > >
> > > > > > data2[fila,1]$Var)] <- Rmax
> > > > > >
> > > > > > fila = fila + 1
> > > > > >
> > > > > > if (fila == rr) {break}
> > > > > >
> > > > > > }
> > > > > >
> > > > > > <
> > > > > >
> > > > > >
> https://www.avast.com/sig-email?utm_medium=email&utm_source=link&utm_campaign=sig-email&utm_content=webmail
> > > > > >
> > > > > > Libre
> > > > > >
> > > > > > de virus. www.avast.com
> > > > > >
> > > > > > <
> > > > > >
> > > > > >
> https://www.avast.com/sig-email?utm_medium=email&utm_source=link&utm_campaign=sig-email&utm_content=webmail
> > > > > >
> > > > > > <#DAB4FAD8-2DD7-40BB-A1B8-4E2AA1F9FDF2>
> > > > > >
> > > > > >         [[alternative HTML version deleted]]
> > > > > >
> > > > > >
> > > > > > R-help-es mailing list
> > > > > >
> > > > > > R-help-es using r-project.org
> > > > > >
> > > > > > https://stat.ethz.ch/mailman/listinfo/r-help-es
> > > > >
> > > > > --
> > > > >
> > > > > Saludos,
> > > > >
> > > > > Carlos Ortega
> > > > >
> > > > > www.qualityexcellence.es
> > >
> > > R-help-es mailing list
> > >
> > > R-help-es using r-project.org
> > >
> > > https://stat.ethz.ch/mailman/listinfo/r-help-es
> >
> > [[alternative HTML version deleted]]
> >
> > R-help-es mailing list
> >
> > R-help-es using r-project.org
> >
> > https://stat.ethz.ch/mailman/listinfo/r-help-es
>

<https://www.avast.com/sig-email?utm_medium=email&utm_source=link&utm_campaign=sig-email&utm_content=webmail>
Libre
de virus. www.avast.com
<https://www.avast.com/sig-email?utm_medium=email&utm_source=link&utm_campaign=sig-email&utm_content=webmail>
<#DAB4FAD8-2DD7-40BB-A1B8-4E2AA1F9FDF2>

	[[alternative HTML version deleted]]



Más información sobre la lista de distribución R-help-es