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 ifSW (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 ifSW (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

Respuestas a la pregunta(3)

Su respuesta a la pregunta