【问题标题】:Merge two dataframes r for backtest合并两个数据帧 r 进行回测
【发布时间】:2018-05-31 03:13:28
【问题描述】:

我想合并两个包含单个股票时间序列的数据框,因此每列代表股票的信息。所以 Dataframe 1 有股票价格,Dataframe 2 有 P/E Ratios。我的目标是准备一个数据框,我可以将它与需要这种格式的数据框的包回测一起使用:

library('backtest')
data(starmine)

结构如下:

date PRICE  symbol
date1 4.2    AAPL
date1 6.3    MSFT
date1 2.2    GE
date2 4.1    AAPL
date2 6.3    MSFT
date2 2.5    GE

因此数据集按月份分组。我的数据来自多个数据框,每个数据框都包含所有股票和所有日期的感兴趣变量(例如价格、市盈率等)。一个例子:

dates <- seq(as.Date("1995/1/1"), by = "month", length.out = 10)

a = sample(0:1,10,rep=TRUE) 
b = sample(0:1,10,rep=TRUE)
c = sample(0:1,10,rep=TRUE)
prices = data.frame(dates,a,b,c)       

a = sample(0:1,10,rep=TRUE) 
b = sample(0:1,10,rep=TRUE)
c = sample(0:1,10,rep=TRUE)
pe = data.frame(dates,a,b,c)       

谁能以某种方式合并 df1 和 df2 以获得与 starmine 中相同的结构?我想到了这样的事情:

> total <- merge(df1,df2,by=colnames)
Error in as.vector(x, mode) : 
cannot coerce type 'closure' to vector of type 'any'

这是我想要得到的结构:

date     price  pe  symbol  
1995/1/1 4.2    0.5     a
1995/1/1 6.3    0.4     b
1995/1/1 2.2    0.3     c
1995/2/1 4.1    0.4     a
1995/2/1 6.3    0.2     b
1995/2/1 2.5    0.1     c
1995/3/1 4.2    0.5     a
1995/3/1 6.3    0.4     b
1995/3/1 2.2    0.3     c
1995/4/1 4.1    0.4     a
1995/4/1 6.3    0.2     b
1995/4/1 2.5    0.1     c

【问题讨论】:

  • id 中的df2 是什么?
  • 抱歉,这不应该在那里,之前尝试的错字。感谢您指出。我会修复它。
  • 看起来你的问题是关于重塑而不是合并。也许我错过了一些东西。但是,您可以将df1df2 中的每一个重新整形为具有starmine 之类的格式,其中symbol 列将具有abc 之类的值。那是你要的吗?如果没有,你能发布你期望的理想输出吗?
  • 试试 library(dplyr); library(tidyr); df1 %&gt;% gather(symbol, price, -dates) 看看这是否是您正在寻找的格式。
  • 这听起来可行,但它是按库存分组的。所以它一次堆叠所有的股票。但我想按日期分组。我在上面发布了我想到的结构。

标签: r dataframe merge


【解决方案1】:
# example data
dates <- seq(as.Date("1995/1/1"), by = "month", length.out = 10)

a = sample(0:1,10,rep=TRUE) 
b = sample(0:1,10,rep=TRUE)
c = sample(0:1,10,rep=TRUE)
prices = data.frame(dates,a,b,c)       

a = sample(0:1,10,rep=TRUE) 
b = sample(0:1,10,rep=TRUE)
c = sample(0:1,10,rep=TRUE)
pe = data.frame(dates,a,b,c)     

library(dplyr)
library(tidyr)

# add dataset name as a column
prices$name = "price"
pe$name = "pe"

tbl_df(rbind(prices, pe)) %>%
  gather(symbol, value, -dates, -name) %>%   
  spread(name, value)

# # A tibble: 30 x 4
#        dates symbol    pe price
# *     <date>  <chr> <int> <int>
# 1 1995-01-01      a     1     0
# 2 1995-01-01      b     0     1
# 3 1995-01-01      c     0     0
# 4 1995-02-01      a     0     0
# 5 1995-02-01      b     0     1
# 6 1995-02-01      c     0     1
# 7 1995-03-01      a     0     0
# 8 1995-03-01      b     1     0
# 9 1995-03-01      c     0     0
# 10 1995-04-01     a     0     1
# # ... with 20 more rows

我使用tbl_df(rbind(prices, pe)) 仅用于可视化目的。你真的不需要tbl_df(),所以你可以使用rbind(prices, pe)

【讨论】:

  • 是的!太完美了,非常感谢!!!感谢您的快速帮助!
猜你喜欢
  • 2015-08-12
  • 2014-04-14
  • 2012-03-07
  • 2019-03-29
  • 2020-06-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多