【问题标题】:Selecting rows by condition and ordering including duplicates按条件选择行并排序,包括重复项
【发布时间】:2017-10-13 22:00:03
【问题描述】:

我试图创建一个小例子来说明我的问题。第一列是不同的日期,第二列是在这些特定日期发生的降级。我需要为每个降级过滤 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() 函数。

我该如何解决这个问题?

【问题讨论】:

    标签: r select


    【解决方案1】:

    您可能希望更改创建索引的方式,如下所示。

    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>
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-11-15
      • 1970-01-01
      • 1970-01-01
      • 2016-09-02
      • 2013-09-18
      • 2020-10-07
      • 2016-10-22
      • 2014-07-17
      相关资源
      最近更新 更多