Re: [R-es] Ordenar data.frame por fecha en función pivot_wider.

2020-12-14 Por tema Carlos Ortega
Hola,

Puedes crear una nueva variable en la que se convierta los "meses-año" en
eso fechas. Y luego ordenar por ello.
De hecho recientemente lubridate añadió la función para tratar los
"meses-año" con "*my()*".

Also así como:

library(lubridate)

botiquines<-base_agregada_botiquines_anio_mes %>%
  *mutate(mesanio = my(mes_anio)) %>%*
  #group_by(Mes,anio) %>%
  *group_by(mesanio) %>%*
  summarise(botiquines_n = sum(sum_botiquines, na.rm = T)) %>%
  ungroup() %>%
  #group_by(Mes,año) %>%
  *pivot_wider(id_cols="mesanio", names_from=mesanio,
values_from=botiquines_n)*
  #pivot_wider(id_cols="anio",names_from=Mes,values_from=botiquines_n)


Saludos,
Carlos Ortega
www.qualityexcellence.es


El lun, 14 dic 2020 a las 17:46, juan manuel dias ()
escribió:

> Hola, como andan!
>
> Tengo una base con información de envío de botiquines por año y mes. Tengo
> columna año y mes por separado y las quiero unir y transformar a formato
> fecha.
> Lo necesito en formato fecha para poder ordenar el data.frame al aplicar
> función pivot_wider.
>
> botiquines<-base_agregada_botiquines_anio_mes %>%
>   group_by(Mes,año) %>%
>   summarise(botiquines_n = sum(sum_botiquines, na.rm = T)) %>%
>   ungroup() %>%
>   #group_by(Mes,año) %>%
>   pivot_wider(id_cols="año",names_from=Mes,values_from=botiquines_n)
>
> Actualmente el resultado es este:
>
> [image: image.png]
>
> Necesitaría una columna mes-año en formato fecha para que el data-frame de
> salida esté ordenado por esa columna, de modo tal que me quede primero
> 01-2019 segundo 02-2019 y tercero 03-2019, y así suecesivamente etc.
>
> Adjunto csv para que puedan ver los datos.
>
> Muchas gracias!
>
> Juan.
>
> ___
> 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
___
R-help-es mailing list
R-help-es@r-project.org
https://stat.ethz.ch/mailman/listinfo/r-help-es


[R-es] Ordenar data.frame por fecha en función pivot_wider.

2020-12-14 Por tema juan manuel dias
Hola, como andan!

Tengo una base con información de envío de botiquines por año y mes. Tengo
columna año y mes por separado y las quiero unir y transformar a formato
fecha.
Lo necesito en formato fecha para poder ordenar el data.frame al aplicar
función pivot_wider.

botiquines<-base_agregada_botiquines_anio_mes %>%
  group_by(Mes,año) %>%
  summarise(botiquines_n = sum(sum_botiquines, na.rm = T)) %>%
  ungroup() %>%
  #group_by(Mes,año) %>%
  pivot_wider(id_cols="año",names_from=Mes,values_from=botiquines_n)

Actualmente el resultado es este:

[image: image.png]

Necesitaría una columna mes-año en formato fecha para que el data-frame de
salida esté ordenado por esa columna, de modo tal que me quede primero
01-2019 segundo 02-2019 y tercero 03-2019, y así suecesivamente etc.

Adjunto csv para que puedan ver los datos.

Muchas gracias!

Juan.


prueba_bot.csv
Description: MS-Excel spreadsheet
___
R-help-es mailing list
R-help-es@r-project.org
https://stat.ethz.ch/mailman/listinfo/r-help-es


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

2020-12-14 Por tema l.graco--- via R-help-es
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 
 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,  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 
>>  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 (emilopezc...@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@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

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

2020-12-14 Por tema Carlos Ortega
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 ()
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,  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@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 (emilopezc...@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@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 1x1, y
> > > > >
> > > > > además los dígitos de la columna primera son superiores al puesto
> en
> > este
> > > > >
> > > > > ejemplo, entonces el tiempo de calculo es excesivo.
> > > > >
> > > > > 
> > > > >
> > > > > 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)
> > 

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

2020-12-14 Por tema Carlos Santos
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,  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@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 (emilopezc...@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@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 1x1, y
> > > >
> > > > además los dígitos de la columna primera son superiores al puesto en
> este
> > > >
> > > > ejemplo, entonces el tiempo de calculo es excesivo.
> > > >
> > > > 
> > > >
> > > > 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 ==
> > > >
> > > > 

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

2020-12-14 Por tema l.graco--- via R-help-es
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 
 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 (emilopezc...@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@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 1x1, y
> > >
> > > además los dígitos de la columna primera son superiores al puesto en este
> > >
> > > ejemplo, entonces el tiempo de calculo es excesivo.
> > >
> > > 
> > >
> > > 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_source=link_campaign=sig-email_content=webmail
> > >  Libre
> > >
> > > de virus. www.avast.com
> > >
> > > https://www.avast.com/sig-email?utm_medium=email_source=link_campaign=sig-email_content=webmail
> > >
> > > El dom, 13 dic 2020 a las 12:49, Carlos Ortega (c...@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
> > > >
> > > > 

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

2020-12-14 Por tema Carlos Santos
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 ()
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 
> 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 1x1, y
>> además los dígitos de la columna primera son superiores al puesto en este
>> ejemplo, entonces el tiempo de calculo es excesivo.
>>
>> 
>>
>> 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}
>> }
>>
>
>
>>
>>
>>
>> 
>>  Libre
>> de virus. www.avast.com
>> 
>>
>> El dom, 13 dic 2020 a las 12:49, Carlos Ortega ()
>> 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@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_source=link_campaign=sig-email_content=webmail
 >
 Libre
 de virus. www.avast.com
 <