将函数应用于dplyr中的多个组

时间:2018-05-17 01:13:19

标签: r function dplyr data.table

我有一个计算一天土壤水的功能(来自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:第一天的蒸发转移,EToCNDC这些都是常数。

它返回一个带有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??

1 个答案:

答案 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()