Попробуйте это, используя al oop и индекс:
#Data
df <- structure(list(Date = 2000:2008, Return = c(0.1, 0.2, 0.3, 0.4,
0.5, 0.6, 0.7, 0.8, 0.9)), class = "data.frame", row.names = c(NA,
-9L))
#Code
#Create index
seqi <- seq(3,dim(df)[1],by = 3)
#Allocate in var
df$var<- NA
#Sum
for(i in seqi)
{
df[i,'var']<-sum(df$Return[(i-2):i],na.rm=T)
}
Вывод:
Date Return var
1 2000 0.1 NA
2 2001 0.2 NA
3 2002 0.3 0.6
4 2003 0.4 NA
5 2004 0.5 NA
6 2005 0.6 1.5
7 2006 0.7 NA
8 2007 0.8 NA
9 2008 0.9 2.4
Для нескольких столбцов здесь подход, но необходимо выбрать столбцы и распределить результаты в другом фрейме данных. После этого их можно комбинировать. Весь код для этого следующий:
#Data
df <- structure(list(Date = 2000:2008, Return = c(0.1, 0.2, 0.3, 0.4,
0.5, 0.6, 0.7, 0.8, 0.9), Return1 = c(0.1, 0.2, 0.3, 0.4, 0.5,
0.6, 0.7, 0.8, 0.9), Return2 = c(0.1, 0.2, 0.3, 0.4, 0.5, 0.6,
0.7, 0.8, 0.9)), row.names = c(NA, -9L), class = "data.frame")
#Function
compute <- function(x)
{
#Code
#Create index
seqi <- seq(3,length(x),by = 3)
#Create empty vector
empty <- rep(NA,length(x))
#Sum
for(i in seqi)
{
empty[i]<-sum(x[(i-2):i],na.rm=T)
}
return(empty)
}
Теперь примените:
#Apply
add <- as.data.frame(apply(df[,-c(1)],2,function(x) compute(x)))
names(add) <- paste0('Dif.',names(add))
#Final df
ndf <- cbind(df,add)
Date Return Return1 Return2 Dif.Return Dif.Return1 Dif.Return2
1 2000 0.1 0.1 0.1 NA NA NA
2 2001 0.2 0.2 0.2 NA NA NA
3 2002 0.3 0.3 0.3 0.6 0.6 0.6
4 2003 0.4 0.4 0.4 NA NA NA
5 2004 0.5 0.5 0.5 NA NA NA
6 2005 0.6 0.6 0.6 1.5 1.5 1.5
7 2006 0.7 0.7 0.7 NA NA NA
8 2007 0.8 0.8 0.8 NA NA NA
9 2008 0.9 0.9 0.9 2.4 2.4 2.4