2017-10-13 8 views
1

問題の小さな例を作成しようとしました。最初の列は異なる日付で、2番目の列はこれらの特定の日付に発生したダウングレードです。私は、ダウングレードごとに3行をフィルタリングする必要があります:ダウングレードの前日、ダウングレードが発生した日、およびダウングレード後の日。条件で行を選択し、重複を含む順序を設定する

df <- data.frame(date = Sys.Date() - 19:0, dgrd = NA) 
df$dgrd[c(4, 10, 11, 16)] <- "X" #small dataframe inclduing problematic downgrades 

down <- which(!is.na(df$dgrd)) #select all days where downgrade occured 
keep <- df[c(down-1, down, down+1), ] #select the specific days for each downgrade 

print(keep) 

date  dgrd 
2017-09-26 <NA> 
2017-10-02 <NA> 
2017-10-03 X 
2017-10-08 <NA> 
2017-09-27 X 
2017-10-03 X 
2017-10-04 X 
2017-10-09 X 
2017-09-28 <NA> 
2017-10-04 X 
2017-10-05 <NA> 
2017-10-10 <NA> 

この出力をソートする必要があります。これは、ある特定のダウングレードに属する3日間を並べて表示する必要があります。 2日連続でダウングレードした場合、注文が正しくないため、日付でソートすることはできません。

次のようにすべての3行は1つの格下げに属しているように、だから、最後に私のテーブルには、なります:連日の格下げの場合

date  dgrd 
2017-09-26 <NA> 
2017-09-27 X 
2017-09-28 <NA> 
2017-10-02 <NA> 
2017-10-03 X 
2017-10-04 X 
2017-10-03 X 
2017-10-04 X 
2017-10-05 <NA> 
2017-10-08 <NA> 
2017-10-09 X 
2017-10-10 <NA> 

、私は私の中で必要な重複行があります最終的な出力であるため、unique()関数を使用することはできません。

どうすればこの問題を解決できますか?

答えて

2

インデックスを作成する方法を次のように変更することができます。

down <- which(!is.na(df$dgrd)) 
index <- unlist(lapply(down, function(x) c(x - 1, x, x + 1))) 
keep <- df[index, ] 
keep 
      date dgrd 
3 2017-09-26 <NA> 
4 2017-09-27 X 
5 2017-09-28 <NA> 
9 2017-10-02 <NA> 
10 2017-10-03 X 
11 2017-10-04 X 
10.1 2017-10-03 X 
11.1 2017-10-04 X 
12 2017-10-05 <NA> 
15 2017-10-08 <NA> 
16 2017-10-09 X 
17 2017-10-10 <NA> 
関連する問題