0

我正在为一些 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

然后,我想将嵌套循环的每次迭代的所有结果放入一个数据框中,因此我将统计信息(rmseerr_mean)作为列,将每个不同的条件组合(sets$Allcats_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  |
+-----+-----------+------+--------+-------+

(虽然在现实生活中将有五列用于各种标准,大约十列用于统计)

我希望这有某种意义 - 任何建议将不胜感激。

4

0 回答 0