Заполнение матрицы несколькими столбцами из существующей матрицы, сопоставленной с фреймом данных - PullRequest
0 голосов
/ 27 марта 2012

У меня есть матрица данных, м :

                 12345      12348
2011-05-13          NA 0.18001079
2011-05-16 0.056780170 0.15526660
2011-05-17 0.005848973 0.17363081
2011-05-18 0.096594178 0.20114677
2011-05-19 0.038920055 0.15744843

И у меня есть фрейм данных, df :

id    date
12345 2011-05-13
12345 2011-05-18
12348 2011-05-13
12348 2011-05-19

Я хотел бы добавить в свой фрейм данных df новую запись e (я думаю, что это другая матрица, но я не уверен насчет терминологии), которая содержит значения из моя матрица за 20 полезных дней до и после даты в дф. Под «полезным днем» я подразумеваю тот, который появляется в именах строк (м).

id    date       e
12345 2011-05-13 [40x1 double matrix]
12345 2011-05-18 [40x1 double matrix]
12348 2011-05-13 [40x1 double matrix]
12348 2011-05-19 [40x1 double matrix]

Я могу использовать shift.down и shift.up из matrixcalc, чтобы найти 20 «полезных дней» до и после текущего дня, и я могу использовать match(df$date,rownames(m), чтобы найти нужный мне индекс m.

Однако здесь я застрял. Какой лучший способ создать и заполнить новую запись e , чтобы она содержала информацию, которая мне нужна? Я знаю, что будут записи NA, когда -20 или +20 'полезных дней' выходят за пределы диапазона, для которого у меня есть информация, и есть также записи NA в пределах m в любом случае.

Любая помощь очень ценится.

1 Ответ

1 голос
/ 28 марта 2012

У меня есть ощущение, что то, что вы пытаетесь сделать в целом, может быть выполнено по-другому, но вот решение того, что вы просили.

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

После того, как вы сделаете функцию, вы можете просто применить ее к каждой строкев вашем фрейме данных.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...