2017-01-07 7 views
0

私のデータは以下のような日に最も近いが、それ以前の指定した日付よりも他の要因に基づいて

data.frame(date=c("2013-07","2013-08","2013-09","2013-11", 
       "2013-11","2013-11","2014-02","2014-03"), 
     X=c("0","1","0","0","1","0","1","0")) 

    date x 
1 2013-07 0 
2 2013-08 1 
3 2013-09 0 
4 2013-11 0 
5 2013-11 1 
6 2013-11 0 
7 2014-02 1 

私は現在の日付より後ないデータを示して新しい機能を作成したいですしかし、現在の日付から最も近いは、x = 1

date  x lastdate 
1 2013-07 0  NA 
2 2013-08 1 2013-08 
3 2013-09 0 2013-08 
4 2013-11 0 2013-11 
5 2013-11 1 2013-11 
6 2013-11 0 2013-11 
7 2014-02 1 2014-02 
8 2014-03 0 2014-02 

答えて

1

一つの効率的なソリューションは、fintIntervalを使用することにして唯一のx == "1"内を検索することができるとき。ここでの基本的な考え方は、df$date[df$X == "1"]の先頭にNAを追加することです

findIntervalは(あなたの最初の行のように)ゼロを返したとき、私は

はケースのためのいくつかの方法論のexplnationを先頭にNA_character_を追加しました元のdf$date[df$X == "1"]ベクトル内で検索してください。 df$dateの値がdf$date[df$X == "1"]のすべての値の前にある場合は、findInterval0を割り当てます。このゼロは最終的にNAになるはずです。したがって、findIntervalで見つかったすべてのインシデントに+1を追加し、新しいベクトル(NAを含む)内で検索​​します。このようにして0はすべて1になります。NAが新しいベクトルの最初の値であるため、NAが割り当てられています。側として

df[["lastdate"]] <- c(NA_character_, 
         as.character(df$date[df$X == "1"]))[findInterval(df$date, df$date[df$X == "1"]) + 1] 
df 
#  date X lastdate 
# 1 2013-07 0  <NA> 
# 2 2013-08 1 2013-08 
# 3 2013-09 0 2013-08 
# 4 2013-11 0 2013-11 
# 5 2013-11 1 2013-11 
# 6 2013-11 0 2013-11 
# 7 2014-02 1 2014-02 
# 8 2014-03 0 2014-02 

か(これはdplyrタグを持っている)

library(dplyr) 
df %>% 
    mutate(lastdate = c(NA_character_, as.character(date[X == "1"]))[findInterval(date, date[X == "1"]) + 1]) 

むしろnumericXcharacter 1で動作するように、おそらく容易になるだろう注意してください、とcharacterというかzoo::yearmonのいずれかfactor(変更が難しい)dateカラム

+0

ステートメントのロジックが "lastdate"ベクターアプリケーションを構築する方法についての説明を追加することは可能でしょうかropriately?私は時間と時間を費やして、 'findInterval()'とその文がどのように連動するかをまとめようと努力しました。残念ながら、基底Rの条件論理が "1"ベクトルから引っ張るか、代わりに "findInterval + 1"ベクトルから引っ張るかについて私の頭を包んでいるようには思えません。 –

+0

@leerssej私は説明を追加しました - 今はっきりしていることを願っています。ちょっとしたことに、あるコードを理解していないときはいつも、それを最初に壊すことができます。たとえば、 'findInterval(df $ date、df $ date [df $ X ==" 1 "])+ 1'などを見てみることができます。 –

+0

ありがとう。私はそれをすべてのコンポーネントに分解しました。実際に何度か。すべての個々の作品は、しかし、追加されませんでした。あなたの解は、あなたの解がそのベクトルを多かれ少なかれ入れ子にしているように見えると思うので、あなたの説明は役に立ちます。最初の値より前の値を見つけると、その「上」に反復的に足します。 –

関連する問題