2017-07-08 14 views
1

私は毎年観測しているデータフレームを持っています。私は毎年「3月10日から5月12日」のような範囲にフィルタリングしたいと思います。おそらくそれは私の貧しいグーグルのスキルですが、私は月の日の建設のいくつかの並べ替えを見つけることができませんでした。ここでフィルタを月間の間隔に設定する

は、サンプルのDFです:複雑に

set.seed(123) 

dates <- seq.Date(from=as.Date("1970-01-01"), to=as.Date("2007-08-31"), by="days") 

sample.df <- data.frame(date=dates, 
         data=rnorm(length(dates))) 

別の添加は、「2月2へ12月10日」として、長年にわたって横切る範囲を維持することですすべての必要な日付がデータフレームに含まれていると見なすことができますが、データフレームが2007年になる場合など、一部のNAを作成する必要があるかもしれませんので、2007年12月10日から2008年2月2日までは実行できません。

+0

ここでは2つの質問があります。それらを別々の投稿に分けるのがベストです。最初のケースでは、あなたは年を気にしませんか? 2番目のケースでは、年が重要ですか? – CPak

+0

@ChiPak私は範囲を毎年どちらかの方法で保持したいのですが、ちょうど1つの場合には範囲が別の年になるかもしれません。最初のケースは、1970年3月10日から1970年5月12日まで、1971年3月10日から1971年5月12日までを維持することです。第2のケースでは、1970年12月10日から1971年2月2日"、" 1971年12月10日〜1972年2月2日 "、...私はこれらの2つのケースが十分似ていることを願っています。 – Almacomet

答えて

1

dplyrlubridate

年を無視
library(dplyr) 
library(lubridate) 

sample.df %>% filter(between(date, ymd("2006-03-10"), ymd("2006-05-12"))) 

sample.df %>% filter(between(date, ymd("2006-10-11"), ymd("2007-02-01"))) 

sample.df %>% 
    mutate(dummy = (month(date)*100) + day(date)) %>% 
    filter(between(dummy,310,512)) %>% 
    select(-dummy) 
+0

ありがとう、これは1年間だけ働き、何年もの間面倒です。 – Almacomet

1

これは、年の任意の数のためにと任意の複雑な論理条件のために動作します。パッケージは使用されません。

monthday <- format(sample.df$date, "%m%d") 

sample.df[ monthday >= "0310" & monthday <= "0512", ] # mar 10 - may 12 

sample.df[ monthday <= "0202" | monthday >= "1210", ] # dec 10 - feb 02 

sample.df[ monthday <= "0202" | 
      (monthday >= 0310" & monthday <= "0512") | 
      monthday >= "1210", ] # both 
関連する問題