如何使用现有虚拟变量创建一个新虚拟变量,该变量对于组内的某些主要观察值采用值 1

发布于 2025-01-15 13:55:45 字数 1278 浏览 1 评论 0原文

我有一个如下所示的数据集:

 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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

冷夜 2025-01-22 13:55:45

我们可以在 lag

library(dplyr)
dat %>%
  group_by(id) %>%
  mutate(d = cummax(lag(sp, 2, default = 0))) %>%
  ungroup

输出上使用 cummax

 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

We can use cummax on the lag

library(dplyr)
dat %>%
  group_by(id) %>%
  mutate(d = cummax(lag(sp, 2, default = 0))) %>%
  ungroup

-output

 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
北凤男飞 2025-01-22 13:55:45

这是使用 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

Here is an alternative using cumsum and an ifelse statement:

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
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文