我有一个计算一天土壤水的功能(来自ZeBook包)
allowsMultipleSelection
这个函数有三个参数: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))
}
:第i - 1天的含水量
WAT0
:第i天的降雨,RAIN
:第一天的蒸发转移,ETo
,CN
和DC
这些都是常数。
它返回一个带有WAT1的数据帧,WAT1是第i天,RO和DR的含水量
一个例子:
FC
现在我想在第1天到第10天运行此功能。示例数据
CN <- 60;FC <- 42;DC <- 0.02
water.update(WAT0 = 23, RAIN = 5, ETo = 2)
# 26, 0, 0
以下功能使用weather <- data.frame(day = 1:10 ,rain = sample(1:100, 10, replace = T), ETo = sample(1:10, 10, replace = T))
功能计算从第1天到第10天的土壤水分。
water.update
这给了我三列:第一列含水,第二列是RO,第三列是DR。
我的问题是我需要运行&#39; water.model&#39;多年和地点的功能
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)
我有两个问题:
1)如何从第1天到第10天为每个地点和年份运行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))
。
water.model
2)欢迎任何有关更快地完成上述功能的建议。也许使用Rcpp? :)
编辑
该函数还采用变量big.data %>% group_by(loc.id, year) %>% do??
答案 0 :(得分:4)
d3.json('src/mockelasticdata.json', function(error, mockdata) {
if (error) return console.error(error);
console.log('mockdata',mockdata);
mapdata = mockdata;
draw(mockdata)
});
是一种灵活的group_by() %>% nest()
模式,用于执行分组操作,其中操作结果可以是不同的形状/类。
此示例将它们存储为列表列,然后根据需要将其拉出tidyverse
。
unnest()