将插值模型数据列添加到 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
我正在尝试将我的模型数据与 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