2017-09-21 5 views
0

漠然としたタイトルに対する謝罪ですが、問題の一部は、私がここで何をしようとしているのかを説明する専門用語がわからないことです。この特定の方法でデータを操作するにはどうすればよいですか?

私はこのようになり、データがあります。

STATE COUNT DATE 
LA  20  20160401 
ME  83  20160601 
MD  4  20160701 

をそして私がやりたいことは日付を選択(のは20160301を言わせて)、以下に私のデータを操作することができます:

STATE COUNT DATE  NEWER_THAN 
LA  20  20160401 20160301 
LA  20  20160401 20160401 
ME  83  20160601 20160301 
ME  83  20160601 20160401 
ME  83  20160601 20160501 
ME  83  20160601 20160601 
MD  4  20160701 20160301 
MD  4  20160701 20160401 
MD  4  20160701 20160501 
MD  4  20160701 20160601 
MD  4  20160701 20160701 

LAの最初のテーブルの日付は20160401だったので、3月と4月は20160301の日時以降の2番目のテーブルの2行で終了します。

同様に、MEは最初のテーブルの201601の日付は、3月、4月、5月、6月以降の2番目のテーブルの4行で終わるので、20160301を選択した日以降です。

そして私の質問はRでこのタイプのデータ操作をどのように達成するかについて誰にもわからないことがあります。

答えて

1

"日付"フィールドを実際のDateオブジェクトに変換すると、2つの日付の差を差し引くことで得られます。そしてその違いから、各行を何回繰り返す必要があるかを知っています。 あなたeaxmple後:

dataset <- data.frame(STATE = c("LA", "ME", "MD"), 
        COUNT = c(20, 83, 4), 
        DATE = c("20160401", "20160601", "20160701"), 
        stringsAsFactors = F) 

format <- "%Y%m%d" 
dataset$DATE <- strptime(dataset$DATE, format) 

newDate <- strptime("20160301", format) 

n.times <- ceiling(difftime(dataset$DATE, newDate, units = "days")/30) 
dataset[rep(seq_len(nrow(dataset)), n.times), ] 

は以下になります:

STATE COUNT  DATE 
    LA 20 2016-04-01 
    LA 20 2016-04-01 
    ME 83 2016-06-01 
    ME 83 2016-06-01 
    ME 83 2016-06-01 
    ME 83 2016-06-01 
    MD  4 2016-07-01 
    MD  4 2016-07-01 
    MD  4 2016-07-01 
    MD  4 2016-07-01 
    MD  4 2016-07-01 
+0

あなたが使用している場合は、 'ライブラリ(lubridate)'あなたが簡単に不格好 '天井を使用しなくても暦月の違いを取得することができます(X/30) 'hack - BTWが失敗する2月 – dww

関連する問題