如何使用事件假人从事件数据更改为时间序列横截面数据?

How to change from event data to time-series cross-sectional data with event dummies?

我得到了一个数据集,其中按以下方式按国家/地区列出了特定事件的日期。

country date1 date2   
1    03/01/2012    05/01/2012
2    05/04/2012    12/10/2012
3    07/12/2012    20/03/2012
4    04/02/2012    24/12/2012

我需要对这些数据做的是为 country/year/month/day 级别创建面板数据。我想为每个事件创建一个虚拟变量。

country year month   day
1  2012    01    01
1  2012    01    02
1  2012    01    03
1  2012    01    04
1  2012    01    05
1  2012    01    06

最终结果如下所示,每个国家/地区面板在每个单独的事件变量中每个 year/month/day 都有一个 0 或 1。

country year month day event1 event2 
1  2012    01    01    0    0 
1  2012    01    02    0    0
1  2012    01    03    1    0
1  2012    01    04    1    0
1  2012    01    05    1    1
1  2012    01    06    1    1

问题是如何最有效地从我所拥有的数据中获取我需要的数据结构。我发现之前的一个问题有类似的问题(Dummy Variable by date.),但是这个问题没有涉及面板数据。

这是一个tidyverse解决方案。这个想法是使用 tidyr::complete 生成您想要的全套 date-country 组合。然后很容易使用 tidyr::spreadhas_event 的值拆分为每个事件的单独列,并使用 sep 参数创建正确的列名称。剩下的只是清理 - 将日期转换为单独的 yearmonthday 列,删除无关的列,并将 NA 替换为 0事件列。这应该适用于更多国家、每个国家更多事件或大日期范围。

library(tidyverse)
library(lubridate)
#> 
#> Attaching package: 'lubridate'
#> The following object is masked from 'package:base':
#> 
#>     date
tbl <- read_table2(
  "country date1 date2
  1    03/01/2012    05/01/2012
  2    05/04/2012    12/10/2012
  3    07/12/2012    20/03/2012
  4    04/02/2012    24/12/2012"
)
#> Warning in rbind(names(probs), probs_f): number of columns of result is not
#> a multiple of vector length (arg 2)
#> Warning: 1 parsing failure.
#> row # A tibble: 1 x 5 col     row col   expected actual        file         expected   <int> <chr> <chr>    <chr>         <chr>        actual 1     4 date2 ""       embedded null literal data file # A tibble: 1 x 5

tbl %>%
  gather(event, date, date1:date2) %>%
  mutate(date = dmy(date)) %>%
  complete(country, date = seq.Date(min(date), max(date), 1)) %>%
  mutate(
    event = str_remove_all(event, "date"),
    has_event = ifelse(is.na(event), 0, 1)
    ) %>%
  spread(event, has_event, sep = "") %>%
  mutate_at(vars(event1:event2), replace_na, 0) %>%
  mutate(
    year = year(date),
    month = month(date),
    day = day(date)
  ) %>%
  select(country, year:day, event1:event2)
#> # A tibble: 1,428 x 6
#>    country  year month   day event1 event2
#>      <int> <dbl> <dbl> <int>  <dbl>  <dbl>
#>  1       1 2012.    1.     3     1.     0.
#>  2       1 2012.    1.     4     0.     0.
#>  3       1 2012.    1.     5     0.     1.
#>  4       1 2012.    1.     6     0.     0.
#>  5       1 2012.    1.     7     0.     0.
#>  6       1 2012.    1.     8     0.     0.
#>  7       1 2012.    1.     9     0.     0.
#>  8       1 2012.    1.    10     0.     0.
#>  9       1 2012.    1.    11     0.     0.
#> 10       1 2012.    1.    12     0.     0.
#> # ... with 1,418 more rows

reprex package (v0.2.0) 创建于 2018-03-21。