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>
[R-es] Como puedo reducir el tiempo de ejecución en la siguiente rutina
11 messages · Carlos Santos, Carlos Ortega, Emilio L. Cano +1 more
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 [[alternative HTML version deleted]]
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: <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> 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/c9728b1d/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/c9728b1d/attachment-0001.png>
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>
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>
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
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 en 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 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> 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
_______________________________________________
R-help-es mailing list R-help-es en r-project.org
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 en 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 en 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 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 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
-- Saludos, Carlos Ortega www.qualityexcellence.es
R-help-es mailing list R-help-es en r-project.org
[[alternative HTML version deleted]] R-help-es mailing list R-help-es en r-project.org
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 en 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 en 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 en 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 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
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
-- Saludos, Carlos Ortega www.qualityexcellence.es
R-help-es mailing list R-help-es en r-project.org
[[alternative HTML version deleted]] R-help-es mailing list R-help-es en r-project.org
<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>
Si puedes comentar la lógica de f5 (caso en el que haya varios valores máximos), es que no la termino de entender... Gracias, Carlos. El lun, 14 dic 2020 a las 12:25, Carlos Santos (<carlossantos.csm en gmail.com>) escribió:
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 en 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 en 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 en 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 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
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
-- Saludos, Carlos Ortega www.qualityexcellence.es
R-help-es mailing list R-help-es en r-project.org
[[alternative HTML version deleted]] R-help-es mailing list R-help-es en r-project.org
< 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 [[alternative HTML version deleted]]
Aunque no entiendo el objetivo final, te apunto un par de cosas, por si te sirven.
Primero probarÃa lo que te dije de usar data.table y tratar de vectorizar lo máximo.
Luego puedes probar algo asà mediante el tidyverse:
tu_dataframe %>%
rowwise(var) %>%
mutate(maximo = max(c_across(starts_with('M')),na.rm = TRUE ))
Tendrás que ajustarlo para el caso de que haya más de un máximo.
Y ya dependiendo de tu lógica de negocio, podrÃas probar a transformar tu tabla en long, con 4 columnas:
- var
- ref (contendrÃa el nombre de la columna M)
- valor (valor de la columna M)
- casos (cuántas veces aparece cada "valor" para cada "var")
Obtener el/los máximos asà es trivial. Y si ya lo metes en una base de datos y ejecutas un par de sentencias sql eso tiene que llevar muy, muy poco tiempo.
Pero tengo la impresión, subjetiva, de que el proceso que has elegido para los cálculos no es el adecuado. Demasiado complicado. Pero como no sé qué significa var, ni las columnas M ni el propósito de elegir asÃ, tampoco te puedo orientar mejor.
A ver si todo esto te ayuda. Suerte.
??????? Original Message ???????
El lunes, 14 de diciembre de 2020 a las 12:24, Carlos Santos <carlossantos.csm en gmail.com> escribió:
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 en 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 en 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 en 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 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 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
-- Saludos, Carlos Ortega www.qualityexcellence.es
R-help-es mailing list R-help-es en r-project.org
[[alternative HTML version deleted]] R-help-es mailing list R-help-es en r-project.org
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