代码之家  ›  专栏  ›  技术社区  ›  Richard Herron

从两个数据帧创建面板

  •  0
  • Richard Herron  · 技术社区  · 15 年前

    我有两个数据帧——一个是按日期(行)和股票代号(列)排列的股票收盘价:

    > 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 回复  |  直到 15 年前
        1
  •  3
  •   kohske    15 年前

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