Carlos Santos
2020-Dec-13 14:31 UTC
[R-es] Como puedo reducir el tiempo de ejecución en la siguiente rutina
> > 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: 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> > <#m_-198326376745946536_DAB4FAD8-2DD7-40BB-A1B8-4E2AA1F9FDF2> > > El dom, 13 dic 2020 a las 12:49, Carlos Ortega (<cof en 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 en 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 en r-project.org >>> https://stat.ethz.ch/mailman/listinfo/r-help-es >>> >> >> >> -- >> Saludos, >> Carlos Ortega >> www.qualityexcellence.es >> >------------ próxima parte ------------ Se ha borrado un adjunto en formato HTML... URL: <https://stat.ethz.ch/pipermail/r-help-es/attachments/20201213/13e91864/attachment-0001.html> ------------ próxima parte ------------ A non-text attachment was scrubbed... Name: image.png Type: image/png Size: 54553 bytes Desc: no disponible URL: <https://stat.ethz.ch/pipermail/r-help-es/attachments/20201213/13e91864/attachment-0001.png>
Carlos Ortega
2020-Dec-13 15:19 UTC
[R-es] Como puedo reducir el tiempo de ejecución en la siguiente rutina
Hola Carlos, Vaya, lo siento pero creo que me sigue faltando algo para entenderlo todo... 1. Tienes una primera matriz en la que por fila tienes que elegir la columna en la que se produce el máximo. 2. Pero si hay dos/o varios valores de máximo, tienes que coger el valor de "Var" de esa primera matriz y buscarla en la segunda matriz (la imagen que adjunta) y seleccionar la columna de acuerdo a f5... Si pones un ejemplo donde haya un único valor de máximo y otro donde hay que usar esta f5, quedaría ya del todo claro... Gracias, Carlos Ortega www.qualityexcellence.es El dom, 13 dic 2020 a las 15:31, Carlos Santos (<carlossantos.csm en 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: 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> >> <#m_-1660742982892200730_m_-198326376745946536_DAB4FAD8-2DD7-40BB-A1B8-4E2AA1F9FDF2> >> >> El dom, 13 dic 2020 a las 12:49, Carlos Ortega (<cof en 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 en 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 en r-project.org >>>> https://stat.ethz.ch/mailman/listinfo/r-help-es >>>> >>> >>> >>> -- >>> Saludos, >>> Carlos Ortega >>> www.qualityexcellence.es >>> >>-- Saludos, Carlos Ortega www.qualityexcellence.es ------------ próxima parte ------------ Se ha borrado un adjunto en formato HTML... URL: <https://stat.ethz.ch/pipermail/r-help-es/attachments/20201213/0c002ed4/attachment-0001.html> ------------ próxima parte ------------ A non-text attachment was scrubbed... Name: image.png Type: image/png Size: 54553 bytes Desc: no disponible URL: <https://stat.ethz.ch/pipermail/r-help-es/attachments/20201213/0c002ed4/attachment-0001.png>
Emilio L. Cano
2020-Dec-14 07:08 UTC
[R-es] Como puedo reducir el tiempo de ejecución en la siguiente rutina
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 en 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> <x-msg://2/#m_-198326376745946536_DAB4FAD8-2DD7-40BB-A1B8-4E2AA1F9FDF2> > El dom, 13 dic 2020 a las 12:49, Carlos Ortega (<cof en qualityexcellence.es <mailto:cof en 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 <http://www.qualityexcellence.es/> > > El dom, 13 dic 2020 a las 12:33, Carlos Santos (<carlossantos.csm en gmail.com <mailto:carlossantos.csm en 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 <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 <http://www.avast.com/> > <https://www.avast.com/sig-email?utm_medium=email&utm_source=link&utm_campaign=sig-email&utm_content=webmail <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 en r-project.org <mailto:R-help-es en r-project.org> > https://stat.ethz.ch/mailman/listinfo/r-help-es <https://stat.ethz.ch/mailman/listinfo/r-help-es> > > > -- > Saludos, > Carlos Ortega > www.qualityexcellence.es <http://www.qualityexcellence.es/>_______________________________________________ > R-help-es mailing list > R-help-es en r-project.org > https://stat.ethz.ch/mailman/listinfo/r-help-es[[alternative HTML version deleted]]