【问题标题】:Creating a conditional dummy variable column in R在 R 中创建条件虚拟变量列
【发布时间】:2022-01-18 09:12:11
【问题描述】:

我正在处理一个跨国面板数据集,我的一个变量 (cc_dummy) 的值是 1 和 0(也有缺失值由 NA 指示)。我想创建一个新列,如果cc_dummy 在每个国家/地区连续三年取值 1,我只希望每个三年窗口的第一年取值 1,而其他年份取值 0 . 我的数据快照如下。任何帮助,将不胜感激。如果可能,我想使用 dplyr 创建列。

structure(list(country = c("Argentina", "Argentina", "Argentina", 
"Argentina", "Argentina", "Argentina", "Argentina", "Argentina", 
"Argentina", "Argentina", "Argentina", "Argentina", "Argentina", 
"Argentina", "Argentina", "Argentina", "Argentina", "Argentina", 
"Argentina", "Argentina", "Argentina", "Argentina", "Argentina", 
"Argentina", "Argentina", "Argentina", "Argentina", "Argentina", 
"Argentina", "Argentina", "Argentina", "Argentina", "Argentina", 
"Argentina", "Argentina", "Argentina", "Argentina", "Argentina", 
"Argentina", "Argentina", "Argentina", "Argentina", "Argentina", 
"Argentina", "Argentina", "Argentina", "Brazil", "Brazil", "Brazil", 
"Brazil", "Brazil", "Brazil", "Brazil", "Brazil", "Brazil", "Brazil", 
"Brazil", "Brazil", "Brazil", "Brazil", "Brazil", "Brazil", "Brazil", 
"Brazil", "Brazil", "Brazil", "Brazil", "Brazil", "Brazil", "Brazil", 
"Brazil", "Brazil", "Brazil", "Brazil", "Brazil", "Brazil", "Brazil", 
"Brazil", "Brazil", "Brazil", "Brazil", "Brazil", "Brazil", "Brazil", 
"Brazil", "Brazil", "Brazil", "Brazil", "Brazil", "Brazil", "Brazil", 
"Brazil", "Brazil"), year = c(1975, 1976, 1977, 1978, 1979, 1980, 
1981, 1982, 1983, 1984, 1985, 1986, 1987, 1988, 1989, 1990, 1991, 
1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 
2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012, 2013, 
2014, 2015, 2016, 2017, 2018, 2019, 2020, 1975, 1976, 1977, 1978, 
1979, 1980, 1981, 1982, 1983, 1984, 1985, 1986, 1987, 1988, 1989, 
1990, 1991, 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 
2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 
2012, 2013, 2014, 2015, 2016, 2017, 2018, 2019, 2020, 2021), 
    cc_dummy = c(NA, NA, 0, 0, 0, 0, 1, 1, 0, 1, 0, 0, 1, 1, 
    1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 
    0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, NA, NA, 0, 0, 1, 0, 
    1, 0, 1, 0, 0, 0, 1, 1, 1, 1, 0, 1, 1, 0, 0, 0, 0, 0, 1, 
    0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 
    0, 0, 0)), row.names = c(NA, -93L), class = c("tbl_df", "tbl", 
"data.frame"))

【问题讨论】:

    标签: r dataframe dplyr conditional-formatting dummy-variable


    【解决方案1】:

    这是一种使用data.table::rleiddplyr 语法的方法:

    library(dplyr)
    df %>% 
      group_by(country, m = data.table::rleid(cc_dummy)) %>% 
      mutate(newcol = ifelse(n() >= 3 & cumsum(cc_dummy) == 1, 1, 0))
    
    # A tibble: 93 x 5
    # Groups:   country, m [32]
       country    year cc_dummy     m newcol
       <chr>     <dbl>    <dbl> <int>  <dbl>
     1 Argentina  1975       NA     1      0
     2 Argentina  1976       NA     1      0
     3 Argentina  1977        0     2      0
     4 Argentina  1978        0     2      0
     5 Argentina  1979        0     2      0
     6 Argentina  1980        0     2      0
     7 Argentina  1981        1     3      0
     8 Argentina  1982        1     3      0
     9 Argentina  1983        0     4      0
    10 Argentina  1984        1     5      0
    11 Argentina  1985        0     6      0
    12 Argentina  1986        0     6      0
    13 Argentina  1987        1     7      1
    14 Argentina  1988        1     7      0
    15 Argentina  1989        1     7      0
    16 Argentina  1990        0     8      0
    17 Argentina  1991        0     8      0
    18 Argentina  1992        0     8      0
    19 Argentina  1993        0     8      0
    20 Argentina  1994        0     8      0
    21 Argentina  1995        0     8      0
    22 Argentina  1996        0     8      0
    23 Argentina  1997        0     8      0
    24 Argentina  1998        0     8      0
    25 Argentina  1999        0     8      0
    26 Argentina  2000        0     8      0
    27 Argentina  2001        0     8      0
    28 Argentina  2002        1     9      0
    

    【讨论】:

    • 这很棒。谢谢!
    猜你喜欢
    • 2023-03-24
    • 2013-09-23
    • 1970-01-01
    • 2021-10-31
    • 1970-01-01
    • 1970-01-01
    • 2018-09-16
    • 1970-01-01
    • 2015-10-22
    相关资源
    最近更新 更多