我正在努力学习一些R代码,我肯定必须能够使用其中一个应用系列函数编写代码,但我无法弄清楚如何。
我有一个数据框,列出了我测量过的许多网站。此数据框具有各种元数据(包括站点名称),以及该站点的汇总统计信息。我需要使用元数据中的值选择许多不同的站点组,然后获取原始原始数据(即每个站点的每个观察点)并计算其中的统计信息。
这些组的选择标准非常复杂,我基本上都在做各种不同子集的各种可能组合,所以我认为最好通过索引的交集来做到这一点。所以,我的代码看起来像:
# Calculate indices for each of the selection criteria
sets = list(All=1:nrow(df), UK=which(ClassifiedValAERONET$UK == 1))
cat_excluded = list(None=1:nrow(df), Separated=which(ClassifiedValAERONET$Category1_SmallIsland == 0 & ClassifiedValAERONET$Category2_SeparatedLandMass == 0))
# Loop over all combinations of the categories above,
# intersect and then calculate the statistics
for (i in 1:length(sets))
{
for (j in 1:length(cat_excluded))
{
ind = intersect(unlist(sets[i]), unlist(cat_excluded[j]))
ind <- unlist(ind)
print(get_stats(ind))
print("-------------------------------------")
}
}
在这段代码中,我将匹配各种条件的索引放入列表中,然后在这两个列表上有一个嵌套的for循环(以获取所有组合),将索引相交以获得与两个条件匹配的行,然后传递这些一个函数,它提取具有这些索引的站的所有原始数据,然后计算统计数据。此函数的结果是一个包含各种统计信息的列表:
List of 8
$ rmse : num 1.5
$ err_mean : num 0.631
$ err_sd : num 1.37
$ perc_err_mean: num 3.79
$ perc_err_sd : num 10.1
$ m : num 0.949
$ R2 : num 0.993
$ n : int 9163
然后我想将嵌套循环的每次迭代的所有结果放入一个数据框中,因此我将统计信息(rmse
,err_mean
等)作为列和每个不同的组合条件(sets$All
,cats_excluded$Any
等)作为行。当然,不知何故,我需要在此数据框中添加额外的列,以准确说明该行使用的条件。
我很确定我这样做的方式并不是最好的方式,但我不确定如何以'正确的R方式'来做这件事。我故意将我的统计计算放在一个函数中,以便我可以使用apply(或类似的),但我看不出我可以应用这个。如果我可以在数据框中应用其中已有类别的所有组合(请参见下面的草图),那么这将是一个良好的开端,但我不知道如何创建其中一个。
+-----+-----------+
| Set | Excluded |
+-----+-----------+
| All | None |
| All | Separated |
| UK | None |
| UK | Separated |
+-----+-----------+
理想的最终结果将是:
+-----+-----------+------+--------+-------+
| Set | Excluded | RMSE | Perc_E | Max_E |
+-----+-----------+------+--------+-------+
| All | None | 2.53 | 0.65 | 34.5 |
| All | Separated | 1.87 | 0.54 | 9.87 |
| UK | None | 4.53 | 0.1 | 3.62 |
| UK | Separated | 1.23 | 0.87 | 6.78 |
+-----+-----------+------+--------+-------+
(虽然在现实生活中,各种标准将有五列,统计数据约为十列)
我希望这有一定道理 - 任何建议都会受到高度赞赏。