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
D las deudas.
¿Hay alguna forma de optimizarlo eliminando los for y el if?
Desde ya muchas gracias.
Sebastián.