2016-03-01 88 views
1

我有一個有多列和多行的數據幀。數據基於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 
+0

已經嘗試過任何東西或者搜索過類似的問題嗎? –

+0

@ danas.zuokas我有,但不幸的是沒有任何類似於我提出的tge scenerio。 – Aquarius

+0

試試'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

回答

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")