应用函数计算复杂数据帧子集的统计量

时间:2013-11-09 17:26:02

标签: r dataframe subset apply

我正在努力学习一些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

然后我想将嵌套循环的每次迭代的所有结果放入一个数据框中,因此我将统计信息(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  |
+-----+-----------+------+--------+-------+

(虽然在现实生活中,各种标准将有五列,统计数据约为十列)

我希望这有一定道理 - 任何建议都会受到高度赞赏。

0 个答案:

没有答案