I have a data which has 40 days of the year and some data
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))
I want to calculate another variable called aetc for each day which is calculated as follows:
SW.ini <- 2 # setting some initial values
SW.max <- 5
SW.min <- 0
For day 1,
1) Determine a variable called PAW(day1) = SW.ini + rain(day1)
2) If PAW(day1) >= SWC(day1), aetc(day1) = petc(day1)
;
If `PAW(day1) < SWC(day1), aetc(day1) = PAW(day1)/SWC(day1) * petc(day1)`
3) Check if aetc(day1) > PAW(day1). If yes, aetc(day1) = paw(day1)
4) Update SW(day1) = SW.ini + rain(day1) - aetc(day1)
5) If SW(day1) > SW.max, SW(day1) = SW.max. Similarly if
SW(day1) < SW.min, SW(day1) = SW.min`
Repeat for day 2
1) Determine PAW(day2) = SW(day1) + rain(day2)
2) If PAW(day2) >= SWC(day2), aetc(day2) = petc(day2)
;
If PAW(day2) < SWC(day2), aetc(day2) = PAW(day2)/SWC(day2) * petc(day2)
3) Check if aetc(day2) > PAW(day2)
. If yes, aetc(day2) = paw(day2)
4) Update SW(day2) = SW(day1) + rain(day2) - aetc(day2)
5) If SW(day2) > SW.max, SW(day2) = SW.max. Similarly if
SW(day2) < SW.min,
SW(day2) = SW.min`
Here's my elegant for loop to do this:
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]))
}
My problem is that this is just one year of data and I want run it for multiple years.
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))
So I wanted to do something like
df %>% group_by(year) # and then run the above function for each year.
Is there a dplyr or any other solution to this?
Thank you