按条件选择行并包括重复项排序
问题描述:
我试图创建一个我的问题的小例子。第一列是不同日期,第二列是在这些特定日期发生的降级。我需要在每次降级时过滤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()
功能不能使用。
我该如何解决这个问题?
答
您可能想要如下更改创建索引的方式。
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>