【问题标题】:Daily Average to monthly total in RR中的每日平均值到每月总计
【发布时间】:2015-07-14 06:53:10
【问题描述】:
Date        DE      VE
12/1/2016   93.387  0.095
11/1/2016   77.968  0.095
10/1/2016   65.184  0.095
9/1/2016    63.984  0.095
8/1/2016    67.657  0.095
%m/%d/%Y

DE 和 VE 是每日平均值。如何根据当月的实际天数将 R 中的日平均值转换为月总计? 2016 年 12 月的总计 =93.387*31。需要计算从 2006 年 1 月到 2016 年 12 月所有 10*12 个月的每月总数。

【问题讨论】:

  • 格式应该是%m/%d/%Y吧?
  • 是的..你是对的。很抱歉造成混乱。
  • @jkl 如果链接中的解决方案有帮助,我们可以将其作为重复项关闭
  • 我认为它们不是同一个问题。它有超过10年的数据。我想计算 2001-01 到 2016-12 的每月总计

标签: r average


【解决方案1】:

要查找一个月中的天数,您可以使用 lubridate 包中的 days_in_month 函数。

参数采用日期时间对象,因此您必须将Date 列转换为已知的基于日期/日期时间的类(即“POSIXct, POSIXlt, Date, chron, yearmon, yearqtr, zoo, zooreg, timeDate, xts , its, ti, jul, timeSeries 和 fts 对象”)。

然后你可以mutate你的 df 乘以每日平均值。

library(lubridate)
library(dplyr)

myDf <- read.table(text = "Date        DE      VE
12/1/2016   93.387  0.095
11/1/2016   77.968  0.095
10/1/2016   65.184  0.095
9/1/2016    63.984  0.095
8/1/2016    67.657  0.095", header = TRUE)

mutate(myDf, Date = as.Date(Date, format = "%m/%d/%Y"), 
       monthlyTotalDE = DE * days_in_month(Date),
       monthlyTotalVE = VE * days_in_month(Date))

#             Date     DE    VE monthlyTotalDE monthlyTotalVE
#     1 2016-12-01 93.387 0.095       2894.997          2.945
#     2 2016-11-01 77.968 0.095       2339.040          2.850
#     3 2016-10-01 65.184 0.095       2020.704          2.945
#     4 2016-09-01 63.984 0.095       1919.520          2.850
#     5 2016-08-01 67.657 0.095       2097.367          2.945

编辑

mutate 中,如果您使用新的列名,它会将此列附加到数据框中。 如果你想避免添加列,你必须保留已经存在的列名,它会覆盖这些列,例如

mutate(myDf, Date = as.Date(Date, format = "%m/%d/%Y"), 
       DE = DE * days_in_month(Date), 
       VE = VE * days_in_month(Date))

#         Date       DE    VE
# 1 2016-12-01 2894.997 2.945
# 2 2016-11-01 2339.040 2.850
# 3 2016-10-01 2020.704 2.945
# 4 2016-09-01 1919.520 2.850
# 5 2016-08-01 2097.367 2.945

如果您有很多列要计算,我建议您使用mutate_each,它非常强大,并且可以避免您手动使用mutate 进行计算,或者通过执行传统循环而损失性能。

使用varsmutate 中包含/排除变量。

您可以使用以减号开头的变量名手动排除变量: vars = -Date 或者使用向量排除多个变量vars = c(Date, DE)

或者您也可以使用 dplyr::select 中的特殊规范函数,有关详细信息,请参阅 ?dplyr::select。

警告:如果您使用vars包含 变量,如果您想保留列名,请不要在函数中显式命名参数vars =

one_of(c("DE", "VE")), DE:VE... 要删除变量,请在函数前使用--contains("Date")

myDf %>%
mutate(Date = as.Date(Date, format = "%m/%d/%Y")) %>%
mutate_each(funs(. * days_in_month(Date)),
            vars = -Date)

#         Date       DE    VE
# 1 2016-12-01 2894.997 2.945
# 2 2016-11-01 2339.040 2.850
# 3 2016-10-01 2020.704 2.945
# 4 2016-09-01 1919.520 2.850
# 5 2016-08-01 2097.367 2.945

【讨论】:

  • 谢谢。我有超过 100 列需要转换。有没有办法在不添加新列的情况下做到这一点?
  • mutate中,如果你保留一个已经存在的列名,它将覆盖这个列并且不添加一个新的,例如mutate(myDf, Date = as.Date(Date, format = "%m/%d/%Y"), DE = DE * days_in_month(Date), VE = VE * days_in_month(Date))
  • 我编辑了我的帖子以避免添加新列并使用mutate_each计算大量列
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-01-24
  • 2021-12-18
  • 2017-11-10
  • 2014-06-30
相关资源
最近更新 更多