使用 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
是 重复的 你也可以使用 min
、max
、mean
或 last
而不是 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
中的值)。
我有一个名为 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
是 重复的 你也可以使用 min
、max
、mean
或 last
而不是 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
中的值)。