2016-07-11 12 views
3

R環境で特定の基準に基づいてサブセット化したいデータフレームがあります。これは条件付きフィルタの一種です。私のデータフレームは、2004年から2014年までの毎日の1日の値のパネルデータセットです。データフレームの各日は別々の観測です。毎年366日あります。私は、閏年だけがパネルデータの366日を保持するようにデータをサブセット化したいと思います。 -2004年、2008年、2012年の3つの閏年があります。年と曜日の別々の列があります。言い換えれば、366日目がなくても2004年、2008年、および2012年以外のデータセットを返すスクリプトが必要です。条件付き基準に基づいたフィルタ

私は次の方法でこれを達成しました。 (2005年〜366年、2006年〜366年、2007年〜366年、2009年〜366年、2010年〜366年、2011年〜366年、2013年〜366年間)をサブセット化するためにdplyrのフィルタコマンドを使用しました、2014-366)。しかしこれは非常に粗末な方法です。私は誰かがここで正しい方向に私を向けることを望んでいた。ここでは、私が使用したワークフローに沿って再現可能なデータをいくつか示します。データを設定し

#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") 

答えて

4

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

は今、あなたは2000年が含まれている場合非閏年を特定することはトリッキーになります(今年は4で割り切れない)AND(日は366に等しい)(例を除外し、データセット内/または世紀-年...)

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

あなたはあなたの日付の正しいDate値を導出する必要があります。これは、各行のyearの1月1日の文字列表現を作成し、Date型に強制してからDateの値にday(マイナス1)を追加することで実行できます。

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

私たちは、その後、Date値から年を引き出し、入力yearに対してそれをチェックすることができます。一致しなかった場合は、year/dayの組み合わせが無効であることがわかり、データから消滅させることができます。無効なうるう年は、上記の導出メソッドの下で翌年の1月1日に変換されるため、これは機能します。

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 
関連する問題