【问题标题】:How to find monotonous sequence along with taking into account sequence restart on reaching the maximum如何找到单调序列以及在达到最大值时考虑序列重新启动
【发布时间】:2017-05-18 00:29:52
【问题描述】:

我有一个 data.table 说 dt

name <- c("a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n", "o", "p", "q", "r", "s", "t", "u", "v")
score <- c(42, 82, 43, 32,47,48, 49, 50, 54, 59, 76, 09, 13, 88, 91, 99, 04, 06, 08, 12, 14, 15)
class <- c("c1", "c1", "c1", "c1","c1", "c1", "c1", "c2", "c2", "c2", "c3", "c3", "c3", "c3","c3", "c3", "c3", "c3", "c3", "c3", "c3" ,"c3")
dt <- data.table(name, score, class)

看起来像:

> dt
    name score class
 1:    a    42    c1
 2:    b    82    c1
 3:    c    43    c1
 4:    d    32    c1
 5:    e    47    c1
 6:    f    48    c1
 7:    g    49    c1
 8:    h    50    c2
 9:    i    54    c2
10:    j    59    c2
11:    k    76    c3
12:    l     9    c3
13:    m    13    c3
14:    n    88    c3
15:    o    91    c3
16:    p    99    c3
17:    q     4    c3
18:    r     6    c3
19:    s     8    c3
20:    t    12    c3
21:    u    14    c3
22:    v    15    c3

我只需要那些遵循每个班级分数单调序列的记录。在这种情况下,c1 类只记录分数为 42、43、47、48 49,类 c2 分数为 50、54、59 的记录。

在“c3”类记录中,得分为 76、88、91、99、04、06、08、12、14、15。此处序列已达到最大值(99),然后重新开始。 “c3”类中的分数 09 和 13 超出了单调序列,因此需要删除。

我想删除那些在 c1、c2、c3 类中提到的分数不按顺序排列的记录。总共有 100 万条记录。

对于一个给定的班级,最多可以有 3 个连续的乱序分数。

最终的输出必须是这样的。

> dt
    name score class
 1:    a    42    c1
 2:    c    43    c1
 3:    e    47    c1
 4:    f    48    c1
 5:    g    49    c1
 6:    h    50    c2
 7:    i    54    c2
 8:    j    59    c2
 9:    k    76    c3
10:    n    88    c3
11:    o    91    c3
12:    p    99    c3
13:    q     4    c3
14:    r     6    c3
15:    s     8    c3
16:    t    12    c3
17:    u    14    c3
18:    v    15    c3

为了找到单调的序列我试过了:

dt <- dt[, .SD[score == cummax(score)],class]

但这也删除了在达到最大值后重新启动的序列。如何做到这一点。

【问题讨论】:

  • score列的值是否总是在1-99之间?
  • 没有分值一般最高可达999999,但例如我这里取的是99
  • 您必须解释为什么第 2 行“不按顺序”以及第 8 行发生了什么。
  • 第 2 行不按顺序,因为它后面的序列分数超过 3,第 8 行不按顺序,因为该值与正常序列相差很大,因此是异常值。跨度>
  • 另外两个问题看起来几乎相同(数据除外):stackoverflow.com/questions/44030594/…stackoverflow.com/questions/44094497/…

标签: r data.table


【解决方案1】:

cummax 的想法非常好 - 你只需要一些修改:

dt[, keep := score >= cummax(shift(score, fill = first(score))), 
     by = .(class, rleid(score == 99))]

或者,也许更好的方法是

dt[dt[, .I[score == cummax(score)], by = list(class, rleid(score == 99))]$V1]

【讨论】:

  • 但这也会删除所有其他分数,因为乱序是在开始时发生的。假设如果类“c1”中的 82 写入记录 2,那么以下所有记录都将被标记为 FALSE。最多只能有 3 个连续的乱序分数。
  • @archit 据我所知,这给出了问题中要求的输出......?如果您需要添加一些额外的解释,最好将其编辑到问题中。当然,编辑以使答案无效在这里并不是很好的礼仪,除非 docendo 可以接受。
  • @docendo,我正在编辑问题以使数据代表所需的内容。
  • @docendo,我已经编辑了问题并更正了数据。
  • 任何人都可以评论如何进行
猜你喜欢
  • 1970-01-01
  • 2020-02-17
  • 2020-08-09
  • 2020-03-08
  • 1970-01-01
  • 2016-06-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多