我要处理的数据存在此问题
基本上在此数据表A中:
FIRM yrqtr happened
A 2001Q1 0
A 2001Q2 0
A 2001Q3 1
A 2001Q4 0
A 2002Q1 1
A 2002Q2 0
A 2002Q3 0
基本上“ yrqtr”是季度变量,发生在此FIRM A“发生”的事情上,并且是因子变量。
我想创建一个时间索引变量,以使发生前四分之一(发生== 1)的时间索引将收到时间索引0,而在接收到时间索引-1之前为四分之一。由于它在“发生”之前,因此该行中的“发生”列将收到0。
(happened == 1)接收时间索引2后的未来四分之一也一样,在该行发生的也将变为1,接收时间索引3后发生的未来二分之一又将变为1。
我只希望发生前后2个周期,否则将有一个时间索引NA或忽略它。
如果这家公司只发生一次,这很容易做到,通过在(happened == 1)之后使用seq()函数创建附加的时间列,并在“ happened”上使用ifelse条件,如果时间为正则“ happened”将为1,负时间将为0。
但是现在我有两个“发生”并且彼此重叠,我想创建其他行以适应重叠的时间。
这就是我想要的:
FIRM yrqtr happened time
A 2001Q1 0 -1
A 2001Q2 0 0
A 2001Q3 1 1
A 2001Q4 1 2
A 2002Q1 1 3
A 2001Q3 0 -1
A 2001Q4 0 0
A 2002Q1 1 1
A 2002Q2 1 2
A 2002Q3 1 3
因此,这就像发生两个事件的时间轴错开了一样,创建了新的行以适应时间变量。
任何人都知道如何使用例如data.table还是我需要为此编写一个循环?
这与创建用于交错差值估计的数据有关。
非常感谢。
答案 0 :(得分:1)
假设happened
列应保持与以前相同,这是使用zoo
和data.table
的一种可行方法:
library(zoo)
DT[, yrqtr := as.yearqtr(yrqtr)]
DT[happened==1L,
.(yrqtr=seq(yrqtr-0.5, by=0.25, length.out=5),
happened=c(0L,0L,1L,1L,1L),
time=-1L:3L),
by=.(FIRM, rowid(happened))][, rowid:=NULL]
输出:
FIRM yrqtr happened time
1: A 2001 Q1 0 -1
2: A 2001 Q2 0 0
3: A 2001 Q3 1 1
4: A 2001 Q4 1 2
5: A 2002 Q1 1 3
6: A 2001 Q3 0 -1
7: A 2001 Q4 0 0
8: A 2002 Q1 1 1
9: A 2002 Q2 1 2
10: A 2002 Q3 1 3
数据:
library(data.table)
DT <- fread("FIRM yrqtr happened
A 2001Q1 0
A 2001Q2 0
A 2001Q3 1
A 2001Q4 0
A 2002Q1 1
A 2002Q2 0
A 2002Q3 0")