Создание фиктивной переменной на основе временных событий в R - отрывы и задержки

В настоящее время я ищу метод для создания набора фиктивных переменных, указывающих временное событие на панели. Я явно пытаюсь сделать фиктивные переменные, указывающие на событие за 20 лет до события и через 20 лет после события, например, влияние войны на торговлю через 20 лет. Я хочу закодировать этот манекен для каждого участника диада. Как это возможно, элегантно запрограммировать эти манекены? Буду признателен за вашу помощь:)

   iso_o iso_d year mid_o mid_d
  ABW   AFG 1980     0     1
  ABW   AFG 1981     0     1
  ABW   AFG 1982     0     1
  ABW   AFG 1983     0     2
  ABW   AFG 1984     0     1
  ABW   AFG 1985     0     1
  ABW   AFG 1986     0     1
  ABW   AFG 1987     0     1
  ABW   AFG 1988     0     0
  ABW   AFG 1989     0     1

И вот куда я хочу пойти:

   iso_o iso_d year mid_o mid_d mid_o_t-20 mid_o_t-19 mid o_t-18 .... mid_d_t-20 
  ABW   AFG 1980     0     1     0          0           0 
  ABW   AFG 1981     0     1     0          0           0 
  ABW   AFG 1982     0     1     0          0           0 
  ABW   AFG 1983     0     2     0          0           0 
  ABW   AFG 1984     0     1     0          0           0  
  ABW   AFG 1985     0     1     0          0           0

2 ответа

Я предполагаю здесь da.f (Короче для data.frame без столкновения с известными функциями) приблизительно соответствует вашей структуре, поскольку вы не включили ее в вопрос.

library(zoo)
#da.f is randomly generated in this example
da.f = data.frame(mid_o = sample(seq(0,4), 50, replace = TRUE), mid_d = sample(seq(0,4), 50, replace = TRUE))
#our result consists of 20 lags backward and forward in time 
res = lag(as.zoo(da.f), -20:20, na.pad = TRUE)

10 мая 2018 года @thistleknot указал мне, что dplyr маски stats собственный lag универсальный Поэтому убедитесь, что у вас нет dplyr прикреплен или вместо запуска stats::lag явно, иначе мой код не будет работать.

Я думаю, что нашел виновника: github.com/tidyverse/dplyr/issues/1586 ответ: Это естественное следствие наличия большого количества пакетов R. Просто будьте явными и используйте stats:: lag или dplyr:: lag

Привет и спасибо за вашу помощь!

Я нашел решение проблемы: мне сначала пришлось преобразовать data.frame в data.table. Вскоре я нашел способ создать несколько столбцов в data.table, комбинируя команды sprintif а также shift, Таким образом, я смог создать 20 лагов и 20 отведений всего за 4 строки кода.

df[, sprintf("mid_o_lag_%0d", 1:20) := shift(mid_o, c(1:20), type = 'lag')]
df[, sprintf("mid_d_lag_%0d", 1:20) := shift(mid_d, c(1:20), type = 'lag')]
df[, sprintf("mid_o_lead_%0d", 1:20) := shift(mid_o, c(1:20), type = 'lead')]
df[, sprintf("mid_d_lead_%0d", 1:20) := shift(mid_d, c(1:20), type = 'lead')]
Другие вопросы по тегам