首页 > 解决方案 > 交错的数据创建额外的行(例如时间变量)

问题描述

我在要处理的数据中有这个问题

基本上在这个数据表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”是季度变量,发生是这家公司“发生”的事情,是一个因素变量。

我想创建一个时间索引变量,以便在发生前 1 个季度(发生 == 1)时间索引将收到时间索引 0,在收到时间索引 -1 之前的 2 个季度。由于它在“发生”之前,该行中的“发生”列将接收 0。

这同样适用于 (happened == 1) 收到时间索引 2 之后的未来 1 季度,并且在该行发生也将变为 1,在收到时间索引 3 之后的未来 2 季度,发生将再次变为 1。

我只想要发生之前和之后的 2 个时期,否则会有时间索引 NA 或者只是省略它。

如果这家公司只发生一次,这很容易做到,通过使用 seq() 函数在 (happened == 1) 之后开始创建额外的时间列,并在“已发生”上使用 ifelse 条件,如果时间为正,则“已发生”将为 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 来处理这个问题,还是我需要为它编写一个循环?

这与为交错差值估计创建数据有关。

非常感谢。

标签: rdata.table

解决方案


假设该happened列应与以前保持一致,这是一种使用zooand的可能方法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")

推荐阅读