我有一个棘手的问题,我希望你友好的人可以帮助我。
我有一个数据集(df1),其中包含可变公司ID,日,日3,日+3, 每个id代表公司的股票代码。
dataset(news)包括变量公司id,day,newstitle,weight
我想在数据集(df1)中创建两个变量event1和event2
event1 =它在时间范围[df1 $ range-3,df2 $ range + 3]之间计算来自数据集(新闻)的newstile的事件,而新闻$ newstitle包含每个df $ id的“order”
event2 =它计算时间范围[df1 $ range-3,df2 $ range + 3]之间的新闻事件与新闻$ newstitle包含每个df @ id的“dividend”
我已经改写了我的问题以便更好地理解。我非常感谢你的帮助。
最佳。
#this would be desired result with new vars event1,event2
out <- read.table(text="
id,date,date_bef3,date_aft3,event1,event2
1605,1992/12/15,1992/12/12,1992/12/18,0,0
1705,1992/12/30,1992/12/27,1993/1/2,1,1
3412,1992/12/31,1992/12/28,1993/1/3,0,0
9921,1993/1/7,1993/1/4,1993/1/10,0,0
2314,1993/1/18,1993/1/15,1993/1/21,1,0",
header=T,sep=",")
#this is index data
df1<-out[,-c(5,6)]
#this is simulated news source data
news<- read.table(text="
id,date,newstitle,weight
2543,1992/12/30,new order,1
1705,1992/12/29,dividend payment,1
1705,1993/1/1,new order,1
9921,1993/1/1,new product,1
2314,1993/1/16,new order,1",
header=T,sep=",")
就像那样的SQL代码:
proc sql;select *
sum (case when news$newstitle="order" ) as event1,
sum (case when news$newstitle="dividend" ) as event2,
from df1,new
where news$date between df$date_bf3 and df$date_af3 ,
news$id=df$id
我的初步过程:
1:内部合并df1和新闻“id”
2:设置虚拟事件1 = 1如果 newdate(date_bef3,date_aft3)和 newstitle包含“订单” 设置虚拟事件2 = 1如果 newdate(date_bef3,date_aft3)和 newstitle包含“dividend”
3:按(id,date)
折叠(求和)event1 event2setDT(df1,key="id")
setDT(news,key="id")
%inner merge
df<-df1[news,]
%set dummy event1, something wrong here
df[newstitle=="order",event1:=as.numeric(between(newsdate,date_bef3,date_aft3))]
答案 0 :(得分:0)
根据您的评论,我相信您想要的是:
# Make dates actual dates instead of factors
library(lubridate)
df1$date_bef3 <- ymd(df1$date_bef3)
df1$date_aft3 <- ymd(df1$date_aft3)
news$date <- ymd(news$date)
event1 = sum(news$newstitle[news$id == df1$id & df1$date_bef3 <= news$date & df1$date_aft3 >= news$date]=="new order")
event2 = sum(news$newstitle[news$id == df1$id & df1$date_bef3 <= news$date & df1$date_aft3 >= news$date]=="dividend payment")