使用 dplyr 按其他列中的值划分列的每月摘要

Divide monthly summary of column by value in other column using dplyr

我有一个名为 df 的数据框,如下所示:

id    date      year  month day value      QC start_yr end_yr series_length                                         
                                    
275 28/09/2010  2010    9   28  1.36159873  1   2010    2020    11
275 29/09/2010  2010    9   29  1.43747532  1   2010    2020    11
275 30/09/2010  2010    9   30  1.15989387  1   2010    2020    11
275 01/10/2010  2010    10  1   1.34619892  1   2010    2020    11
275 02/10/2010  2010    10  2   1.55105293  1   2010    2020    11
275 03/10/2010  2010    10  3   1.37231886  1   2010    2020    11
275 04/10/2010  2010    10  4   1.02093196  1   2010    2020    11
275 05/10/2010  2010    10  5   1.70137763  1   2010    2020    11
275 06/10/2010  2010    10  6   1.64840853  1   2010    2020    11
275 07/10/2010  2010    10  7   1.92625344  1   2010    2020    11
275 08/10/2010  2010    10  8   1.07618248  1   2010    2020    11
275 09/10/2010  2010    10  9   1.04859626  1   2010    2020    11
275 10/10/2010  2010    10  10  0.77795529  1   2010    2020    11
275 11/10/2010  2010    10  11  1.42359686  1   2010    2020    11
275 12/10/2010  2010    10  12  0.91871309  1   2010    2020    11
275 13/10/2010  2010    10  13  0.89544863  1   2010    2020    11
275 14/10/2010  2010    10  14  0.56718421  1   2010    2020    11
275 15/10/2010  2010    10  15  0.70719278  1   2010    2020    11

(还有数千行)

我想创建一个汇总数据集,该数据集按 ID 分组并按月对值求和,然后除以 series_length,得到总体月平均值

我可以使用以下方法为每个站点执行此操作:

mean_monthly <- df %>%
  group_by(id, month) %>%
  summarise(monthly_value = sum(value)/11)

这对于序列长度为 11 的第一个 id 工作正常,但其他 id 的 series_length 在 1 到 30 之间。因此将它们除以 11 会得到不正确的信息。我想总结一下,以便我创建一个新数据集,每月对所有 value 值求和,并自动除以 series_length,而不必像我对 ' 所做的那样指定数字11' 以上。

我希望这是有道理的,非常感谢您的帮助。

只要 series_length 重复的 你也可以使用 minmaxmeanlast 而不是 first。他们都会 return 相同的值。

df %>% 
  group_by(id, month) %>% 
  summarize(monthly_value = sum(value) / first(series_length))

如果 series_length 只是您 group_by 中观察次数的计数,那么您也可以使用 n():

df %>% 
  group_by(id, month) %>% 
  summarize(monthly_value = sum(value) / n())

我不确定是否是这种情况,因为在您的 repex 中,当 month 为 10 时,有超过 11 个观察值(series_length 中的值)。