基于R中的时间段的数据帧列的总和

时间:2016-03-01 10:05:32

标签: r sum

我有一个包含多列和多行的数据框。该数据基于11年期间的月度观察。现在我想根据过去12个月的观察结果得出每列的总和。例如,05年1月的列总和基于其从04年1月到12月的观察结果。而对于2005年2月,则基于从2月4日到1月5日的观察结果,依此类推。我的原始数据框有10年的数据和月度数据。 我将数据帧的一部分说明如下:

df1
Month   A        B      C
Jan-04  0.003   0.006   NA
Feb-04  0.003   0.002   NA
Mar-04  -0.005  -0.001  NA
Apr-04  0.000   0.000   NA
May-04  0.000   -0.002  NA
Jun-04  -0.001  -0.001  NA
Jul-04  -0.001  -0.001  NA
Aug-04  -0.010  NA      NA
Sep-04  0.001   NA      NA
Oct-04  0.002   NA      NA
Nov-04  -0.003  NA      NA
Dec-04  -0.003  NA      NA
Jan-05  0.005  -0.002   NA
Feb-05  -0.0015 0.004   0.0003
Mar-05  -0.0041 0.002   0.0070

所需的结果数据框

Month   A        B      C
Jan-05  -0.013  0.004   NA
Feb-05  -0.011  -0.004  NA
Mar-05  -0.0151 -0.0014 0.0003

1 个答案:

答案 0 :(得分:0)

这是基础R中的解决方案。首先,我们定义一个函数,根据与感兴趣的日期的时间差来对df进行子集化,并在该子集化的df上找到列的总和,然后我们为所有的时间点。

subset_last_year <- function(df, date, cols_to_sum = c("A", "B", "C")){
  date = as.POSIXct(date, format = "%d-%b-%y")
  df$Time_Difference = difftime(date, df$Month_Date, units = "weeks")
  df_last_year = df[df$Time_Difference > 0 & df$Time_Difference < 53, ]
  tmp_col_sum = colSums(df_last_year[ , cols_to_sum], na.rm = TRUE)
  return(tmp_col_sum)
}

#oddly you have to add days
df$Month_Date = paste0("01-", df$Month)
df$Month_Date = as.POSIXct(df$Month_Date, format = "%d-%b-%y")

#not worried about performance because the data set is not that large
dates = c("01-Jan-05", "01-Feb-05", "01-Mar-05")
res = data.frame()
for(i in 1:length(dates)){
  tmp = subset_last_year(df, dates[i])
  res = rbind(res, tmp)
}
rownames(res) = dates
colnames(res) = c("A", "B", "C")