按条件和顺序选择行,包括重复

时间:2017-10-13 13:24:18

标签: r select

我试图创建一个我的问题的小例子。第一列是不同的日期,第二列是降级在这些特定日期发生的。每次降级我需要过滤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行属于一次降级:

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()函数。

我该如何解决这个问题?

1 个答案:

答案 0 :(得分: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>