我有一个 data.table 说 dt
name <- letters[1:22]
score <- c(42, 82, 43, 32, 47, 48, 49, 50, 54, 59,
76, 9, 13, 88, 91, 99, 4, 6, 8, 12, 14, 15)
class <- rep(c('c1', 'c2', 'c3'), c(7, 3, 12))
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,给定类最多可以有 3 个连续的乱序分数。因此,第 2 行(分数 = 82)也是一个乱序分数。
c2 类的成绩为 50、54、59。
在“c3”类中,分数为 76,88,91,99,04,06,08,12,14,15。这里序列已达到最大值(99),然后重新开始。 “c3”类中的 09 分和 13 分不属于单调序列,因此需要删除。
我想删除那些 c1、c2、c3 类中提到的分数不按顺序排列的记录。总共有 100 万条记录。
最终的输出应该是这样的。
> 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]
但这也删除了达到最大值后重新启动的序列。
实际上,序列重新启动的最大值为 999999,尽管在本示例中我将最大值设为 99。我该如何执行此操作。