【发布时间】:2018-05-17 01:13:19
【问题描述】:
我有一个计算一天土壤水分的函数(来自 ZeBook 包)
water.update <- function(WAT0, RAIN, ETo){
S = 25400/CN - 254; IA = 0.2*S
if(RAIN > IA){RO = (RAIN - 0.2 * S)^2/(RAIN + 0.8 * S)
} else {
RO = 0
}
if(WAT0 + RAIN - RO > FC) {DR = DC * (WAT0 + RAIN - RO - FC)
} else {
DR = 0
}
dWAT = RAIN - RO - DR - ETo
WAT1 = WAT0 + dWAT
return(c(WAT1,RO,DR))
}
这个函数接受三个参数:WAT0: 第 i - 1 天的含水量
RAIN:第 i 天降雨,ETo:第 i 天蒸发量,CN,DC 和 FC 是常数。
它返回一个带有 WAT1 的数据帧,它是第 i 天、RO 和 DR 的含水量
一个例子:
CN <- 60;FC <- 42;DC <- 0.02
water.update(WAT0 = 23, RAIN = 5, ETo = 2)
# 26, 0, 0
现在我想在第 1 天到第 10 天运行这个函数。示例数据
weather <- data.frame(day = 1:10 ,rain = sample(1:100, 10, replace = T), ETo = sample(1:10, 10, replace = T))
下面的函数使用water.update函数计算第1天到第10天的土壤水分。
water.model <- function(weather, FC, DC,CN, WAT0){
WAT <- data.frame(matrix(NA, nrow = nrow(weather), ncol = 3))
WAT[1,1] <- WAT0 # WAT0 is a constant
for(day in 1:(nrow(weather)-1)){
WAT[day + 1,] = water.update(WAT[day,1],weather$rain[day],weather$ETo[day])
}
return(WAT)
}
WAT0 <- 20
water.model(weather = weather, FC = FC, CN = CN, WAT0 = WAT0)
这给了我三列:第一列是含水量,第二列是 RO,第三列是 DR。
我的问题是我需要在多年和多个地点运行“water.model”功能
big.data <- data.frame(loc.id = rep(1:3, each = 10*3),
year = rep(rep(1981:1983, each = 10),times = 3),
day = rep(1:10, times = 3*3),
CN = rep(c(50,55,58), each = 10*3), # each location has a contant CN, FC and DC
FC = rep(c(72,76,80),each = 10*3),
DC = rep(c(0.02,0.5,0.8), each = 10*3),
WAT0 = rep(c(20,22,26), each = 10*3),
rain = sample(1:100,90, replace = T),
eto = sample(1:10,90, replace = T))
我有两个问题:
1) 如何从第 1 天到第 10 天为每个位置和年份运行 water.model。
big.data %>% group_by(loc.id, year) %>% do??
2) 欢迎任何关于使上述功能更快的建议。也许使用 Rcpp? :)
编辑
该函数还接受一个变量DC
【问题讨论】:
标签: r function dplyr data.table