[R-es] Eliminar for de multiplicación de matriz (Carlos Ortega)

Sebastian Kruk residuo.solow en gmail.com
Jue Ago 18 15:28:17 CEST 2016


Estimado Carlos:

Pongo una nueva versión del script para que quede más claro.

M=matrix(0,nrow=10,ncol=4)
colnames(M)=c("Y","S","D","H")
#Son 200 períodos y 10 personas
Ingreso <- matrix(0,ncol=200,nrow=10)
#Datos iniciales
M[,"Y"]<-10000:10009
M[,"S"]<-1:10
M[,"H"]<-180:189
#Calculo el ingreso por persona i por período j
for (j in 2:200) {
    #Actualizo los datos por persona en el período j
    for (i in 1:10) {
        M[i,"Y"]=M[i,"S"]*M[i,"H"]-M[i,"D"]+M[i,"Y"]
        M[i,"S"] <- M[i,"S"]*1,01
        #Si el ingreso del individuo i es menor al maximo entonces el
individuo i adquiere una deuda igual al 5% del ingreso máximo y el
individuo de ingreso máximo incrementa en un 5% su ingreso, esto pasa para
cada uno de los individuos.
        if (M[i,"Y"]<max(M[,"Y"])) {
            M[i,"D"]=0.05*max(M[,"Y"])+M[i,"D"]
            M[which.max(M[,"Y"]),"Y"]<-1.05*max(M[,"Y"])
            }
        }
    Ingreso[,j]=M[,"Y"]
}

Saludos,

Sebastián.

El 16 de agosto de 2016, 07:00, <r-help-es-request en r-project.org> escribió:

> Date: Mon, 15 Aug 2016 21:13:31 +0200
> From: Carlos Ortega <cof en qualityexcellence.es>
> To: Sebastián Kruk <residuo.solow en gmail.com>
> Cc: Lista R <r-help-es en r-project.org>
> Subject: Re: [R-es] Eliminar for de multiplicación de matriz
> Message-ID:
>         <CAOKbq8io+n6rX9GEH09dfT86cBBU-yFPkESAYR0MfAiqXSUPkg en mail.
> gmail.com>
> Content-Type: text/plain; charset="UTF-8"
>
> Hola,
>
> Puedes hacerlo con data.table, salvo el detalle del "if".
> Suponiendo que tu data.frame es de esta forma:
>
> tu_df <- data.frame(
>                                 hrs_trab = ... ,
>                                 coste_hr = ....,
>                                 deuda     =....,
>                                 periodo   =
>                              )
>
> Mencionas hacer una agrupación por "período" pero no lo incluyes en tu
> bucle.
> Dependiendo del tipo de este periodo si es una fecha, mes, semana, etc.
> habría que detallarlo un poco más.
> Pero con esa estructura con data.table es bastante inmediato:
>
> library(data.table
> tu_dt <- as.data.table(tu_df)
> tu_dt[ , Ingreso := hrs_trab * coste_hr - deuda, by="periodo"]
>
>
> Y para el "if", lo que haces en el bucle es sumar 1000 unidades cuando el
> valor es negativo.
> No sé si te valdría si al final del cálculo del data.table anterior, al
> valor negativo de "Ingreso" le sumaras las 1000 unidades de esta forma:
>
> tu_dt$Ingreso <- ifelse(tu_dt$Ingreso < 0 , tu_dt$Ingreso + 1000,
> tu_dt$Ingreso)
>
> Para acertar algo más a la primera, convendría que para este tipo de casos,
> incluyeras una parte de la matriz/data.frame con el que trabajas...
>
>
> Saludos,
> Carlos Ortega
> www.qualityexcellence.es
>
> El 14 de agosto de 2016, 14:00, Sebastián Kruk <residuo.solow en gmail.com>
> escribió:
>
> > Estimados usuarios de R:
> >
> > Yo tengo una matriz en que cada fila es una persona y las filas
> > corresponden al ingreso, horas trabajadas, salario por hora  y deudas.
> >
> > El ingreso es igual a las horas trabajadas por el salario por hora menos
> > deudas.
> >
> > Me interesa guardar por individuo por cada período el ingreso.
> >
> > Yo hacía:
> >
> > for t in 2:200 {
> >  for i in 1 in 1:10 {
> >   M[i,Y]=M[i,S]*M[i,H]-M[i,D]+M[i,Y]
> >   if M[i,Y]<1000 {
> >    M[i,D] = 1000 + M[i,D]
> >    }
> >   }
> >  Ing[t]=M[,Y]
> >  }
> >
> > En lo anterior Y es ingreso, H son las horas trabajadas, S es el salario
> y
> > D las deudas.
> >
> > ¿Hay alguna forma de optimizarlo eliminando los for y el if?
> >
> > Desde ya muchas gracias.
> >
> > Sebastián.
>

	[[alternative HTML version deleted]]



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