将插值模型数据列添加到 r 中的字段数据集

Adding interpolated model data column to field dataset in r

我正在尝试将我的模型数据与 r 中的字段数据进行比较。现场数据处于特定深度(1,20,50,75,100,150 ..)。模型数据输出不在同一深度,必须进行插值(线性),最好添加到现场数据中的新列。

我想 运行 在模型数据的每一行上进行一个 for 循环,并使用 approx 函数对数据进行插值以适应字段数据的深度并将其添加到 model_chla柱子。我从两个数据集中提取了相同的日期(19 个日期),因此只需要对模型深度进行插值。

chla_FIELD         # some of the field data with the empty model column
          date depth  chla model_chla
1   2008-02-21     1  0.06         NA
2   2008-02-21    20  0.05         NA
3   2008-02-21    50  0.03         NA
4   2008-02-27     1  0.08         NA
5   2008-02-27    20  0.04         NA
6   2008-02-27    50  0.03         NA
7   2008-02-27    75  0.03         NA
8   2008-02-27   100  0.01         NA
9   2008-03-07     1  0.07         NA
10  2008-03-07    20  0.05         NA
11  2008-03-07    50  0.03         NA
12  2008-03-07    75  0.02         NA
13  2008-03-07   100  0.02         NA
14  2008-03-07   150  0.01         NA


chla_MODEL          # Some of the model data to be interpolated to field data depths and added to column
             dt depth        chla
766  2008-02-21   1.0  0.22385520
767  2008-02-21   7.5  0.21676594
768  2008-02-21  15.0  0.19189246
769  2008-02-21  25.0  0.15524526
770  2008-02-21  40.0  0.14638090
771  2008-02-21  62.5  0.14301939
772  2008-02-21  87.5  0.14094244
773  2008-02-21 112.5  0.13897014
774  2008-02-21 137.5  0.13680272
775  2008-02-21 162.5  0.13430916
776  2008-02-21 187.5  0.13133907
777  2008-02-21 212.5  0.12757768
778  2008-02-21 237.5  0.12237051
779  2008-02-21 262.5  0.11396441
780  2008-02-21 287.5  0.09206185
856  2008-02-27   1.0  0.24240938
857  2008-02-27   7.5  0.23447734
858  2008-02-27  15.0  0.21238998
859  2008-02-27  25.0  0.15545718
860  2008-02-27  40.0  0.14592259
861  2008-02-27  62.5  0.14171122
862  2008-02-27  87.5  0.13900438
863  2008-02-27 112.5  0.13662824

我的开始是这样的,但我对 approx 函数和循环添加数据到列不熟悉。

chla_approx <- function(FieldDATA, ModelDATA)
  
  for (row in FieldDATA) {
  
  }

或者有更简单的方法吗?谢谢!

以下代码假定 chla_FIELD 中的所有日期都出现在 chla_MODEL 中。

如果数据集中的日期已经是class"Date"则不需要这两条指令。

chla_FIELD$date <- as.Date(chla_FIELD$date)
chla_MODEL$dt <- as.Date(chla_MODEL$dt)

现在split/apply/combine.

sp_field <- split(chla_FIELD, chla_FIELD$date)
sp_model <- split(chla_MODEL, chla_MODEL$dt)

approx_fun_list <- lapply(sp_model, function(data){
  approxfun(data[["depth"]], data[["chla"]])
})

chla_FIELD <- lapply(names(sp_field), function(nm){
  f <- approx_fun_list[[nm]]
  sp_field[[nm]]$model_chla <- f(sp_field[[nm]]$depth)
  sp_field[[nm]]
})
chla_FIELD <- do.call(rbind, chla_FIELD)

最后清理。

rm(sp_field, sp_model)

谢谢瑞。出于统计目的,如果我向两个数据集添加一个“源”列:

          date depth  chla source
1   2008-02-21     1  0.06  FIELD
2   2008-02-21    20  0.05  FIELD
3   2008-02-21    50  0.03  FIELD

            dt depth       chla source
766 2008-02-21   1.0 0.22385520  MODEL
767 2008-02-21   7.5 0.21676594  MODEL
768 2008-02-21  15.0 0.19189246  MODEL
769 2008-02-21  25.0 0.15524526  MODEL
770 2008-02-21  40.0 0.14638090  MODEL
771 2008-02-21  62.5 0.14301939  MODEL

拆分后的数据如何串联起来? (仍然插入模型 chla 以匹配场深度)得到这样的东西:

1   2008-02-21     1  0.06  FIELD
2   2008-02-21    20  0.05  FIELD
3   2008-02-21    50  0.03  FIELD
1   2008-02-21     1  0.06  MODEL
2   2008-02-21    20  0.05  MODEL
3   2008-02-21    50  0.03  MODEL
4   2008-02-27     1  0.08  FIELD
5   2008-02-27    20  0.04  FIELD
6   2008-02-27    50  0.03  FIELD
4   2008-02-27     1  0.08  MODEL
5   2008-02-27    20  0.04  MODEL
6   2008-02-27    50  0.03  MODEL