2017-10-13 92 views
1

我試圖創建一個我的問題的小例子。第一列是不同日期,第二列是在這些特定日期發生的降級。我需要在每次降級時過濾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天屬於一個特定降級的輸出。我無法按日期對其進行排序,因爲如果連續兩天降級,訂單就不正確。

那麼,到底我的表應該如下,讓每一個3行屬於一個降級:

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>