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个月的月度总数。
答案 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
或损失造成的痛苦通过传统的循环来实现性能。
使用vars
在mutate
中包含/排除变量。
您可以使用前面带有减号的变量名来手动排除变量:
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