Создать панель из двух фреймов данных - PullRequest
0 голосов
/ 28 октября 2010

У меня есть два фрейма данных - один с ценами закрытия акций, упорядоченными по дате (строки) и символу тикера (столбцы):

> head(data.stocks)
        date     A   AAPL ABAT    AB    ABV
1 2010-10-04 32.59 278.64 3.65 26.42 125.89
2 2010-10-05 33.04 288.94 3.66 27.10 129.05
3 2010-10-06 32.67 289.19 3.59 26.99 129.90
4 2010-10-07 33.20 289.22 3.66 27.04 129.94
5 2010-10-08 33.80 294.07 3.84 26.76 132.66
6 2010-10-11 33.75 295.36 3.87 26.95 133.37

Другой фрейм данных имеет открытый интерес (oi), упорядоченный по одномустрока на символ тикера на дату:

> head(data.oi)
        date symbol  oi close
1 2010-10-04      A   6     0
2 2010-10-04     AA 104     0
3 2010-10-04   AAPL 940     0
4 2010-10-04     AB   0     0
5 2010-10-04   ABAT   0     0
6 2010-10-04    ABB   0     0

Я хотел бы добавить еще один столбец к этому второму фрейму данных, чтобы в итоге я получил «панельный» фрейм данных с одним тикером на дату на строку в строке с oiи цена закрытия.

Я думал, что этот цикл будет работать, но я получаю следующую ошибку:

> for (i in seq(length(data.oi$date))) {
+ row <- which(data.stocks$date == data.oi$date[i])
+ col <- which(colnames(data.stocks) == data.oi$symbol[i])
+ data.oi$close[i] <- data.stocks[row, col]
+ }
Error in data.oi$close[i] <- data.stocks[row, col] : 
  replacement has length zero

FWIW, он хранитпервое значение в data.oi, затем не удается:

> head(data.oi)
        date symbol  oi close
1 2010-10-04      A   6 32.59
2 2010-10-04     AA 104  0.00
3 2010-10-04   AAPL 940  0.00
4 2010-10-04     AB   0  0.00
5 2010-10-04   ABAT   0  0.00
6 2010-10-04    ABB   0  0.00

Спасибо!Я чувствую, что reshape или aggregate может это сделать, но я не могу понять, как объединить эти два.

1 Ответ

3 голосов
/ 28 октября 2010

melt в пакете reshape2 и слияние будет полезно:

library(reshape2)
merge(subset(data.oi,select=-close), 
      melt(d,id.vars="date",variable.name="symbol",value.name="close"))
...