R的每日平均每月总数

时间:2015-05-04 18:50:00

标签: r average totals

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是每日平均值。如何根据当月的实际天数,将每日平均数转换为每日总数? 2016年12月总计= 93.387 * 31。需要计算2006-01至2016-12所有10 * 12个月的月度总数。

1 个答案:

答案 0 :(得分:3)

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

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

然后,您可以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