2017-07-09 2 views
2

Ich möchte eine Liste der Jahr-spezifischen Dummies haben und ich möchte auch Jahre zwei Jahre vor den Jahren markieren, die markiert sind.dplyr: Filter innerhalb von Jahren vor dem markierten Zeitraum

Die Daten sehen wie folgt aus

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 
) 

Also für "USA" Ich möchte auch ein 1 in occurence Spalt setzen für die Jahre 2009 und 2010 sowie für FRA die Jahre 2005, 2006, 2013 und 2014

ich dachte an so etwas wie dies zu tun:

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

Aber ich bin nicht sicher, wie R auf sagen, ly für die Jahre filtern, die ich will.

+0

benötigen Sie folgende Bedingung: '(country ==" USA "& Jahr% in% 2009: 2010) | (country == "FRA" & year% in% c (2005,2006,2013,2014)) ' – Jaap

Antwort

1

Hier erreicht werden ist eine weitere dplyr Lösung:

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 statt lead(occurrence, 1) == 1, weil diese nicht verarbeiten kann NA verwendet.

+0

Perfekt, genau das habe ich gesucht! –

2

Nach Gruppierung von ‚Land‘, können wir bis 2 lead von ‚Ereignis‘ nehmen und erhalten die max jeder Zeile mit pmax in ‚Ereignis‘ die erwartete Ausgabe zu erhalten

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

oder dies kann mit data.table mit einer ähnlichen Methodik

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 
+0

Die' data.table' Version funktioniert für mich. Die 'dplyr'-Version arbeitet mit dem Beispieldatensatz, aber nicht mit meinem realen Datenbestand. Es vermisst einige meiner Dummies und bekommt Attaches einige verzögerte Dummies statt der Leads, die ich will. Ich bin mir nicht sicher warum. –

Verwandte Themen