要查找一个月中的天数,您可以使用 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 进行计算,或者通过执行传统循环而损失性能。
使用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