У меня есть набор данных, подобный приведенному ниже:
dat <- data.frame (id = c(1,1,1,1,1,2,2,2,2,2),
year = c(2015, 2016, 2017,2018, 2019, 2015, 2016, 2017, 2018, 2019),
sp=c(1,0,0,0,0,0,1,0,0,0))
dat
id year sp
1 1 2015 1
2 1 2016 0
3 1 2017 0
4 1 2018 0
5 1 2019 0
6 2 2015 0
7 2 2016 1
8 2 2017 0
9 2 2018 0
10 2 2019 0
Я хотел бы использовать фиктивную переменную "sp" для создания новой фиктивной переменной (назовем ее "d"), которая принимает значение 1 для наблюдений t+2 или более лет (в каждой группе идентификаторов) после того, как переменная sp принимает значение значение 1. Результирующий набор данных должен выглядеть так, как показано ниже:
id year sp d
1 1 2015 1 0
2 1 2016 0 0
3 1 2017 0 1
4 1 2018 0 1
5 1 2019 0 1
6 2 2015 0 0
7 2 2016 1 0
8 2 2017 0 0
9 2 2018 0 1
10 2 2019 0 1
Используя пакет dplyr, я могу создать нужную переменную d для t+2 лет после того, как переменная sp принимает значение 1, но понятия не имею, как присвоить d значение 1 для всех лет (внутри каждой группы id) больше, чем t+2.
dat<-
dat%>%
group_by(id) %>%
mutate(d = dplyr::lag(sp, n = 2, order_by=year,default = 0))
dat
id year sp d
<dbl> <dbl> <dbl> <dbl>
1 1 2015 1 0
2 1 2016 0 0
3 1 2017 0 1
4 1 2018 0 0
5 1 2019 0 0
6 2 2015 0 0
7 2 2016 1 0
8 2 2017 0 0
9 2 2018 0 1
10 2 2019 0 0
Любая помощь горячо приветствуется. Благодарю вас!
Мы можем использовать cummax
на lag
library(dplyr)
dat %>%
group_by(id) %>%
mutate(d = cummax(lag(sp, 2, default = 0))) %>%
ungroup
-выход
A tibble: 10 × 4
id year sp d
<dbl> <dbl> <dbl> <dbl>
1 1 2015 1 0
2 1 2016 0 0
3 1 2017 0 1
4 1 2018 0 1
5 1 2019 0 1
6 2 2015 0 0
7 2 2016 1 0
8 2 2017 0 0
9 2 2018 0 1
10 2 2019 0 1
@ Тео, возможно, ты имел в виду mutate(d = rev(cummax(lag(rev(sp), 2, default = 0))))
?
Вот альтернатива с использованием cumsum
и оператора ifelse
:
dat %>%
group_by(id, col1 = cumsum(sp == 1)) %>%
mutate(d = ifelse(abs(first(year) - year) >= 2, 1, 0)) %>%
ungroup() %>%
select(-col1)
id year sp d
<dbl> <dbl> <dbl> <dbl>
1 1 2015 1 0
2 1 2016 0 0
3 1 2017 0 1
4 1 2018 0 1
5 1 2019 0 1
6 2 2015 0 0
7 2 2016 1 0
8 2 2017 0 0
9 2 2018 0 1
10 2 2019 0 1
Спасибо, Акрун. Как следует изменить ваш код, если вы хотите присвоить d значение 1 за t-2 или меньше лет до того, как sp примет значение 1? Мы просто заменяем «отставание» на «опережение». Это изменение, похоже, не помогает.