У меня есть ощущение, что то, что вы пытаетесь сделать в целом, может быть выполнено по-другому, но вот решение того, что вы просили.
# Create the data
m=matrix(c(NA,0.056780170,0.005848973,0.096594178,0.038920055,0.18001079,0.15526660,0.1736081,0.20114677,0.15744843),ncol=2)
colnames(m) = c(12345,12348)
rownames(m) = c('2011-05-13','2011-05-16','2011-05-17','2011-05-18','2011-05-19')
df=data.frame(id=c(12345,12345,12348,12348),date=as.Date(c('2011-05-13','2011-05-18','2011- 05-13','2011-05-19')))
Идея состоит в том, чтобы сначала создать функциюкоторый возвращает матрицу для одной пары идентификатора и даты.Я не думаю, что вам нужны функции shift.up
или shift.down
из matrixCalc
, но вы можете использовать их, если вам будет проще.
# Create a function that returns a matrix for a single row
get.matrix = function(id,date,shift=20) {
row=match(as.character(date),rownames(m))
rows=max(1,row-shift):min(nrow(m),row+shift)
m[rows,as.character(id),drop=F] # The drop=F means that it won't be reduced to a vector
}
Обратите внимание, что функция обычно возвращает 41 строку, а не 40. Кроме того, если это «ранняя» или «поздняя» дата, то она может вернуть намного меньше.
# Apply that function to all rows
df$e=mapply(get.matrix,id=df$id,date=df$date,SIMPLIFY=F)
После того, как вы сделаете функцию, вы можете просто применить ее к каждой строкев вашем фрейме данных.