【发布时间】: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