合并两个数据帧r以进行回溯测试

合并两个数据帧r以进行回溯测试,r,dataframe,merge,R,Dataframe,Merge,我想合并两个数据帧,其中包含单个股票的时间序列,因此每列表示股票的信息。所以数据框1有股票价格,数据框2有市盈率。我的目标是准备一个数据帧,我可以将其与需要以下格式的数据帧的包backtest一起使用: 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 MSF

我想合并两个数据帧,其中包含单个股票的时间序列,因此每列表示股票的信息。所以数据框1有股票价格,数据框2有市盈率。我的目标是准备一个数据帧,我可以将其与需要以下格式的数据帧的包backtest一起使用:

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
> total <- merge(df1,df2,by=colnames)
Error in as.vector(x, mode) : 
cannot coerce type 'closure' to vector of type 'any'
因此,数据集是按月份分组的。我的数据来自多个数据框,每个数据框包含所有股票和所有日期的感兴趣变量,例如价格、市盈率等。例如:

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)       

我使用tbl\u dfrbindprices,pe仅用于可视化目的。您实际上不需要tbl_df,所以您可以使用rbindprices,pe来代替。

df2中的id是什么?抱歉,不应该有,请键入以前的尝试。谢谢你指出这一点。我会解决它。看起来你的问题是关于重塑而不是合并。也许我错过了什么。但是,您可以对df1和df2中的每一个进行重塑,使其具有类似starmine的格式,其中Column符号将具有类似于a、b或c的值。这就是你想要的吗?如果没有,你能发布你期望的理想输出结果吗;图书馆三年;df1%>%gathersymbol,price,-dates,然后查看这是否是您要寻找的格式。这听起来似乎可行,但它按库存分组。因此,它一次堆叠所有股票。但我想改为按日期分组。我在上面贴出了我心目中的结构。是的!!!太好了,非常感谢你!!!谢谢你的快速帮助!!
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
# 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