R: solución dplyr para bucle for con condiciones iniciales establecidas
Tengo una información que tiene 40 días del año y algunos datos
set.seed(123)
df <- data.frame(day = 1:40,rain = runif(40,min = 0, max = 3), petc = runif(40, min = 0.3, max = 8),swc = runif(40, min = 27.01, max = 117.43))
Quiero calcular otra variable llamada aetc para cada día que se calcula de la siguiente manera:
SW.ini <- 2 # setting some initial values
SW.max <- 5
SW.min <- 0
Para el día 1,
1) Determinar una variable llamadaPAW(day1) = SW.ini + rain(day1)
2) siPAW(day1) >= SWC(day1), aetc(day1) = petc(day1)
;
If `PAW(day1) < SWC(day1), aetc(day1) = PAW(day1)/SWC(day1) * petc(day1)`
3) Verificar siaetc(day1) > PAW(day1). If yes, aetc(day1) = paw(day1)
4) ActualizaciónSW(day1) = SW.ini + rain(day1) - aetc(day1)
5) siSW(day1) > SW.max, SW(day1) = SW.max. Similarly if
SW (día1) <SW.min, SW (día1) = SW.min`
Repita para el día 2
1) determinarPAW(day2) = SW(day1) + rain(day2)
2) siPAW(day2) >= SWC(day2), aetc(day2) = petc(day2)
; SiPAW(day2) < SWC(day2), aetc(day2) = PAW(day2)/SWC(day2) * petc(day2)
3) Verificar siaetc(day2) > PAW(day2)
. En caso afirmativo,aetc(day2) = paw(day2)
4) ActualizaciónSW(day2) = SW(day1) + rain(day2) - aetc(day2)
5) siSW(day2) > SW.max, SW(day2) = SW.max. Similarly if
SW (día2) <SW.min, SW (día2) = SW.min`
Aquí está mi bucle elegante para hacer esto:
df$PAW <- NA
df$aetc <- NA
df$SW <- NA
df$PAW[1] <- SW.ini + df$rain[1]
df$aetc[1] <- ifelse(df$PAW[1] >= df$swc[1], df$petc[1],(df$PAW[1]/df$swc[1])*df$petc[1])
df$aetc[1] <- ifelse(df$aetc[1] > df$PAW[1], df$PAW[1], df$aetc[1])
df$SW[1] <- SW.ini + df$rain[1] - df$aetc[1]
df$SW[1] <- ifelse(df$SW[1] > SW.max, SW.max, ifelse(df$SW[1] < 0, 0,df$SW[1]))
for (day in 2:nrow(df)){
df$PAW[day] <- df$SW[day - 1] + df$rain[day]
df$aetc[day] <- ifelse(df$PAW[day] >= df$swc[day], df$petc[day], (df$PAW[day]/df$swc[day]) * df$petc[day])
df$aetc[day] <- ifelse(df$aetc[day] > df$PAW[day], df$PAW[day],df$aetc[day])
df$SW[day] <- df$SW[day - 1] + df$rain[day] - df$aetc[day]
df$SW[day] <- ifelse(df$SW[day] > SW.max,SW.max, ifelse(df$SW[day] < 0, 0,df$SW[day]))
}
Mi problema es que este es solo un año de datos y quiero ejecutarlo durante varios años.
set.seed(123)
df <- data.frame(year = 1980:2015, day = rep(1:40, each = 36),rain =
runif(40*36,min = 0, max = 3), petc = runif(40*36, min = 0.3, max = 8),swc = runif(40*36, min = 27.01, max = 117.43))
Entonces quería hacer algo como
df %>% group_by(year) # and then run the above function for each year.
¿Hay una dplyr o alguna otra solución para esto?
Gracias