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

时间:2018-03-21 18:04:47

标签: r datetime transformation dummy-variable

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

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
1  2012    01    01
1  2012    01    02
1  2012    01    03
1  2012    01    04
1  2012    01    05
1  2012    01    06

最终结果如下所示,每个国家/地区面板在每个单独的事件变量中每年/每月/每天都有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.),但这个问题没有涉及面板数据。

1 个答案:

答案 0 :(得分:0)

这是一个tidyverse解决方案。我们的想法是使用tidyr::complete生成您想要的全套日期 - 国家/地区组合。然后,可以很容易地使用tidyr::spreadhas_event的值拆分为每个事件的单独列,并使用sep参数创建正确的列名。其余的只是清理 - 将日期转换为单独的yearmonthday列,删除多余的列,并将NA替换为0 in事件列。对于更多国家/地区,每个国家/地区更多事件或大日期范围,这应该是强大的。

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。