【问题标题】:How can I create a dummy variable over consecutive values by group id?如何按组 ID 在连续值上创建虚拟变量?
【发布时间】:2020-12-14 15:12:14
【问题描述】:

我有一个数据框,有些列有 NA 值。此外,数据不平衡(即 ID 的年份不同)。我正在尝试按组 ID 在连续(多年)重复值上创建一个虚拟变量(在 R 中)。

作为一个例子,我有一个 data.frame:

data <- data.frame(Year = c(1980, 1981, 1982, 1983, 1984, 1990, 1991, 1992, 1993,
                            1987, 1988, 1989, 1990, 1991, 1992, 1993, 1994, 1995),
                            ID = c(1,1,1,1,1, 2,2,2,2, 3,3,3,3,3,3,3,3,3), 
                            value=c(0,0,0,NA,1, 0,1,0,1, NA,NA,0,0,0,0,1,0,0))
Year ID value
1  1980  1     0
2  1981  1     0
3  1982  1     0
4  1983  1    NA
5  1984  1     1
6  1990  2     0
7  1991  2     1
8  1992  2     0
9  1993  2     1
10 1987  3    NA
11 1988  3    NA
12 1989  3     0
13 1990  3     0
14 1991  3     0
15 1992  3     0
16 1993  3     1
17 1994  3     0
18 1995  3     0 

我对一个新变量感兴趣,比如“虚拟”,如果在连续 3 年或更长时间内变量“值”的值等于 0,则该变量等于 0,如果值为 NA,则为 NA,其余为 1。 例如在 1980-1982 年,第一个 ID 应该为零,否则分别为 1 或 NA。

我感兴趣的是:

Year  ID  value  dummy
1  1980  1     0      0
2  1981  1     0      0
3  1982  1     0      0
4  1983  1    NA     NA
5  1984  1     1      1
6  1990  2     0      1
7  1991  2     1      1
8  1992  2     0      1
9  1993  2     1      1
10 1987  3    NA     NA
11 1988  3    NA     NA
12 1989  3     0      0
13 1990  3     0      0
14 1991  3     0      0
15 1992  3     0      0
16 1993  3     1      1
17 1994  3     0      1
18 1994  5     0      1

谁能帮帮我?

【问题讨论】:

    标签: r


    【解决方案1】:

    您可以使用 dplyrID 对数据进行分组,按 IDYear 对数据进行排序以创建新变量。 Dummy 将为 1,当且仅当(此人今年的)值和前一年和前一年的值都等于 0。因此,1982 年的 ID1 在本例中的虚拟值为 0。

    library(dplyr)
    
    data %>% 
      group_by(ID) %>% 
      arrange(ID, Year) %>%     ## sort by ID and year
      mutate(dummy = 
               case_when(
                value == 0 & lag(value, n = 1) == 0 & lag(value, n = 2) == 0 ~ 0, ## 3 consec years
                is.na(value) ~ value,  ## if value is NA
                TRUE ~  1 )            ## 1 otherwise
              )
    
    
    # A tibble: 18 x 4
    # Groups:   ID [3]
        Year    ID value dummy
       <dbl> <dbl> <dbl> <dbl>
     1  1980     1     0     1
     2  1981     1     0     1
     3  1982     1     0     0
     4  1983     1    NA    NA
     5  1984     1     1     1
     6  1990     2     0     1
     7  1991     2     1     1
     8  1992     2     0     1
     9  1993     2     1     1
    10  1987     3    NA    NA
    11  1988     3    NA    NA
    12  1989     3     0     1
    13  1990     3     0     1
    14  1991     3     0     0
    15  1992     3     0     0
    16  1993     3     1     1
    17  1994     3     0     1
    18  1995     3     0     1
    

    【讨论】:

    • 这非常有用。谢谢!
    猜你喜欢
    • 1970-01-01
    • 2022-10-14
    • 2020-01-31
    • 1970-01-01
    • 2012-09-27
    • 2023-03-27
    • 1970-01-01
    • 2016-12-23
    • 2017-08-01
    相关资源
    最近更新 更多