代码之家  ›  专栏  ›  技术社区  ›  ulima2_

dplyr:在标记时间段之前的年内过滤

  •  2
  • ulima2_  · 技术社区  · 7 年前

    我想有一份年度国家特定假人的清单,我还想标记年份 两年

    library(tidyverse)
    
    df <- tribble(
      ~year, ~country, ~occurrence, 
      #--|--|----
      2003, "USA", 1,
      2004, "USA", 0,
      2005, "USA", 0,
      2006, "USA", 0,
      2007, "USA", 0,
      2008, "USA", 0,
      2009, "USA", 0,
      2010, "USA", 0,
      2011, "USA", 1,
      2012, "USA", 0,
      2013, "USA", 0,
      2005, "FRA", 0,
      2006, "FRA", 0,
      2007, "FRA", 1,
      2008, "FRA", 1,
      2009, "FRA", 0,
      2010, "FRA", 0,
      2011, "FRA", 0,
      2012, "FRA", 0,
      2013, "FRA", 0,
      2014, "FRA", 0,
      2015, "FRA", 1
    )
    

    所以对于 "USA" 我还想放一个 1 occurence 2009年和2010年以及 FRA 2005年、2006年、2013年和2014年。

    我想过做这样的事情:

    df %>%
      group_by(country) %>%
      mutate(occurence = ifelse("not sure what to put here"),
                                1,
                                0))
    

    2 回复  |  直到 7 年前
        1
  •  2
  •   akrun    7 年前

    按“国家”分组后,我们最多可以选择2个 lead 并获取 max pmax 获取“occurrence”中的预期输出

    df %>%
      group_by(country) %>%
      mutate(occurrence = pmax(occurrence, lead(occurrence, default = 0),
                         lead(occurrence, default=0, n=2)))
    

    或者这可以通过 data.table

    library(data.table)
    setDT(df)[,  occurrence := do.call(pmax, shift(occurrence, n = 0:2,
         type = "lead", fill = 0)), country]
    df
    #    year country occurrence
    # 1: 2003     USA          1
    # 2: 2004     USA          0
    # 3: 2005     USA          0
    # 4: 2006     USA          0
    # 5: 2007     USA          0
    # 6: 2008     USA          0
    # 7: 2009     USA          1
    # 8: 2010     USA          1
    # 9: 2011     USA          1
    #10: 2012     USA          0
    #11: 2013     USA          0
    #12: 2005     FRA          1
    #13: 2006     FRA          1
    #14: 2007     FRA          1
    #15: 2008     FRA          1
    #16: 2009     FRA          0
    #17: 2010     FRA          0
    #18: 2011     FRA          0
    #19: 2012     FRA          0
    #20: 2013     FRA          1
    #21: 2014     FRA          1
    #22: 2015     FRA          1
    
        2
  •  1
  •   LmW.    7 年前

    这里是另一个dplyr解决方案:

    df %>% 
      group_by(country) %>% 
      mutate(
            occurrence=ifelse( lead(occurrence, 1) %in% 1 | 
                               lead(occurrence, 2) %in% 1, 
                               1, occurrence)
             )
    
    # A tibble: 22 x 3
    # Groups:   country [2]
        year country occurrence
       <dbl>   <chr>      <dbl>
     1  2003     USA          1
     2  2004     USA          0
     3  2005     USA          0
     4  2006     USA          0
     5  2007     USA          0
     6  2008     USA          0
     7  2009     USA          1
     8  2010     USA          1
     9  2011     USA          1
    10  2012     USA          0
    11  2013     USA          0
    12  2005     FRA          1
    13  2006     FRA          1
    14  2007     FRA          1
    15  2008     FRA          1
    16  2009     FRA          0
    17  2010     FRA          0
    18  2011     FRA          0
    19  2012     FRA          0
    20  2013     FRA          1
    21  2014     FRA          1
    22  2015     FRA          1
    

    lead(occurrence, 1) %in% 1 使用而不是 lead(occurrence, 1) == 1 NA .