Создание фиктивной переменной на основе временных событий в 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')]