如何使用现有虚拟变量创建一个新虚拟变量,该变量对于组内的某些主要观察值采用值 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 组)在 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 变量取值 t+2 年后创建所需的 d 变量1、但不知道如何为 d 分配大于 t+2 的所有年份(在每个 id 组内)的值 1。
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
非常感谢任何帮助。谢谢你!
I have a dataset like the one below:
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
I'd like to use the "sp" dummy variable to create a new dummy (call it "d") that takes the value of 1 for observations t+2 or more years (within each id group) after the sp variable takes the value of 1. The resulting dataset should look like the one below:
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
Using the dplyr package, I am able to create the desired d variable for t+2 years after the sp variable takes the value of 1, but have no idea how to assign to d the value 1 for all years (within each id group) greater than 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
Any help is much appreciated. Thank you!
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
我们可以在
lag
输出上使用
cummax
We can use
cummax
on thelag
-output
这是使用 cumsum 和 ifelse 语句的替代方法:
Here is an alternative using
cumsum
and anifelse
statement: