我正在为一些 R 代码苦苦挣扎,我确信必须能够使用 apply 系列函数之一编写这些代码,但我不知道如何编写。
我有一个数据框,列出了我进行测量的许多站点。该数据框具有各种元数据(包括站点名称),以及该站点的汇总统计信息。我需要使用元数据中的值选择许多不同的站点组,然后获取原始原始数据(即来自每个站点的每个观察值)并计算其统计数据。
这些组的选择标准相当复杂,我基本上是在做各种不同子集的每一种可能的组合,所以我认为最好通过索引的交集来做到这一点。所以,我的代码看起来像:
# 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 |
+-----+-----------+------+--------+-------+
(虽然在现实生活中将有五列用于各种标准,大约十列用于统计)
我希望这有某种意义 - 任何建议将不胜感激。