У меня большой набор данных, для которого я хочу создать 50 новых переменных, значения которых зависят от значений в предыдущих столбцах, и имена переменных отражают этот факт. Чтобы сделать его более понятным, вот пример:
df <- tibble("a" = runif(10,1990,2000),
"event" = 1995) %>%
mutate("relative_event" = a - event)
Теперь с этим набором данных я хотел бы создать фиктивные переменные, которые кодируют, если конкретное наблюдение происходит за один год до события, за 2 года и т. Д., А также вперед. Один неуклюжий способ сделать это (который работает):
df <- df %>%
mutate("event_b1" = ifelse( (relative_event<=0) & (relative_event > -1),1,0)) %>%
mutate("event_b2" = ifelse( (relative_event<=-1) & (relative_event > -2),1,0)) %>% #etc with more lagx
mutate("event_f1" = ifelse( (relative_event>0) & (relative_event < 1),1,0)) %>%
mutate("event_f2" = ifelse( (relative_event>1) & (relative_event < 2 ),1,0)) #etc with more forward
, где b1 - «на один год раньше», а f2 - «на 2 года вперед». Результат выглядит так:
A tibble: 10 x 7
a event relative_event event_b1 event_b2 event_f1 event_f2
<dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
1 1993. 1995 -1.94 0 1 0 0
2 1992. 1995 -2.59 0 0 0 0
3 2000. 1995 4.75 0 0 0 0
4 1998. 1995 3.25 0 0 0 0
5 1991. 1995 -3.88 0 0 0 0
6 1992. 1995 -3.02 0 0 0 0
7 1996. 1995 1.08 0 0 0 1
8 1994. 1995 -1.04 0 1 0 0
9 1993. 1995 -2.22 0 0 0 0
10 1995. 1995 -0.302 1 0 0 0
Поскольку у меня есть более 50 столбцов для создания, я хотел бы знать, как сделать это автоматически, чтобы мне не пришлось копировать-вставлять 49 раз и вручную изменять условие и имя переменной. Я потратил время на просмотр SO в этой ветке , в этой one , а также в CV, но я все еще не в курсе. Я попробовал следующий код, который не работает:
for (i in 0:10) {
if (i<0) {
event_bi <- paste0("event_b",i)
df <- df %>%
mutate(get(event_bi) = ifelse((relative_event<=-(i-1)) & (relative_event>-i),1,0))
}
}
В идеале я хотел бы узнать, как это сделать с помощью dplyr, но если есть очевидное решение Base R, я тоже с удовольствием его изучу.
Спасибо!