基于R中的时间段的数据帧列总和
问题描述:
我有一个有多列和多行的数据帧。数据基于11年的月度观测数据。现在我想根据过去12个月的观察数据来计算每列的总和。例如,05年1月的总和列是基于其从04年1月到04年12月的观察结果。而05年2月则基于2004年2月至05年1月的观测结果,依此类推。我的原始数据框有10年的数据和月数据。 我说明我的数据帧的一部分,如下所示:基于R中的时间段的数据帧列总和
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
答
以下是在基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")
已经尝试过任何东西或者搜索过类似的问题吗? –
@ danas.zuokas我有,但不幸的是没有任何类似于我提出的tge scenerio。 – Aquarius
试试'library(zoo); library(data.table); na.omit(setDT(df1)[,lapply(.SD,function(x)lag(rollapply(x,12,function(x)sum(x,na.rm = TRUE)))),.SDcols = A: C])' – akrun