2016-07-11 4 views
3

Ich habe einen Datenrahmen in meiner R-Umgebung, die ich möchte Teilmenge basierend auf einem bestimmten Kriterien-eine Art von bedingten Filter. Mein Datenrahmen ist ein Panel-Datensatz mit täglichen Werten für jeden Tag zwischen 2004-2014. Jeder Tag im Datenrahmen ist eine separate Beobachtung. Jedes Jahr hat 366 Tage. Ich möchte die Daten so unterteilen, dass nur die Schaltjahre den 366. Tag in den Paneldaten behalten. Es gibt drei Schaltjahre in diesem Zeitraum - 2004, 2008, 2012. Ich habe eine separate Spalte für das Jahr und den Tag des Jahres. Mit anderen Worten, ich brauche ein Skript, das einen Datensatz ohne den 366. Tag, aber nur für jedes Jahr außer 2004, 2008 und 2012 zurückgibt.Filter basierend auf bedingten Kriterien in r

Ich habe es geschafft, dies folgendermaßen zu erreichen: Ich klebte meinen Tag und Jahresspalten zusammen (zB "2006-366") und verwendet einfach dplyrs Filterbefehl zur Untermenge jedes Jahr (2005-366, 2006-366, 2007-366, 2009-366, 2010-366, 2011-366, 2013-366 , 2014-366). Dies ist jedoch eine schrecklich grobe Methode. Ich hatte gehofft, dass jemand mich hier in die richtige Richtung lenken könnte. Hier sind einige reproduzierbare Daten zusammen mit dem Workflow, den ich verwendet habe.

#Create DF 
year<-rep(c(2004:2014), each=366) 
day<-rep(c(1:366)) 
df<-data.frame(day, year) 

#My crude method 
df $reduc<-paste(df$year, df$day, sep="-") 

df <-df %>% 
    filter(reduc!="2005-366") %>% 
    filter(reduc!="2006-366") %>% 
    filter(reduc!="2007-366") %>% 
    filter(reduc!="2009-366") %>% 
    filter(reduc!="2010-366") %>% 
    filter(reduc!="2011-366") %>% 
    filter(reduc!="2013-366") %>% 
    filter(reduc!="2014-366") 

Antwort

4

Set up Daten:

df <- expand.grid(year=2004:2014,day=1:366) 
nrow(df) ## 4026 

Jetzt ausschließen Fällen, in denen (Jahr durch 4 teilbar ist) und (Tag gleich 366) (Identifizierung nicht-Schaltjahren heikler wäre, wenn Sie 2000 enthalten und/oder hundert Jahre in Ihrem Datensatz ...)

library(dplyr) 
df2 <- df %>% filter(!(year %% 4 > 0 & day==366)) 
2

Sie sollten die richtigen Date Werte für Ihre Daten abzuleiten. Dies kann durch Erstellen der Zeichenfolgedarstellung vom 1. Januar für die Zeile der Zeile, die auf Date typisiert wird, und Hinzufügen der day (minus 1) zum Date-Wert erfolgen.

df$date <- as.Date(paste0(df$year,'-01-01'))+(df$day-1L); 

Wir werden dann in der Lage sein, das Jahr aus dem Date Wert zu ziehen und überprüfen Sie es gegen den Eingang year. Wenn sie nicht übereinstimmen, dann wissen wir, dass die year/day Kombination ungültig war, und wir können sie aus den Daten herausschneiden. Dies funktioniert, weil ungültige Schalttage unter der obigen Ableitungsmethode in den 1. Januar des folgenden Jahres übersetzt werden.

df[df$year==as.integer(strftime(df$date,'%Y')),]; 
##  day year  date 
## 1  1 2004 2004-01-01 
## ... 
## 366 366 2004 2004-12-31 
## 367 1 2005 2005-01-01 
## ... 
## 731 365 2005 2005-12-31 
## 733 1 2006 2006-01-01 
## ... 
## 1097 365 2006 2006-12-31 
## 1099 1 2007 2007-01-01 
## ... 
## 1463 365 2007 2007-12-31 
## 1465 1 2008 2008-01-01 
## ... 
## 1830 366 2008 2008-12-31 
## 1831 1 2009 2009-01-01 
## ... 
## 2195 365 2009 2009-12-31 
## 2197 1 2010 2010-01-01 
## ... 
## 2561 365 2010 2010-12-31 
## 2563 1 2011 2011-01-01 
## ... 
## 2927 365 2011 2011-12-31 
## 2929 1 2012 2012-01-01 
## ... 
## 3294 366 2012 2012-12-31 
## 3295 1 2013 2013-01-01 
## ... 
## 3659 365 2013 2013-12-31 
## 3661 1 2014 2014-01-01 
## ... 
## 4025 365 2014 2014-12-31 
Verwandte Themen