如何使用现有的虚拟变量创建一个新变量,该变量对组内的某些先导观察值取值 1
How to use an existing dummy variable to create a new one that takes the value 1 for certain lead observations within a group
我有一个如下所示的数据集:
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”),它在之后的 t+2 年或更长时间(每个 id 组内)的观察值中取值 1 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 包,我能够在 sp 变量取值为 1 后的 t+2 年内创建所需的 d 变量,但不知道如何将所有年份的值都赋给 d (在每个 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
非常感谢任何帮助。谢谢!
我们可以在 lag
上使用 cummax
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
这是使用 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
我有一个如下所示的数据集:
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”),它在之后的 t+2 年或更长时间(每个 id 组内)的观察值中取值 1 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 包,我能够在 sp 变量取值为 1 后的 t+2 年内创建所需的 d 变量,但不知道如何将所有年份的值都赋给 d (在每个 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
非常感谢任何帮助。谢谢!
我们可以在 lag
cummax
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
这是使用 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