【发布时间】:2014-05-06 01:46:09
【问题描述】:
我有一个包含一串值的数据框,其中包含我想要识别的某些异常读数。我想在我的数据框中制作第三列,将某些读数标记为“异常”,其余为“正常”。查看我的数据图,当我得到这些奇怪的下降时,肉眼看起来很明显,但是由于基线平均值随时间变化,我无法弄清楚如何让 R 识别奇怪的读数。我能想出的最好的方法是使用三个规则将某些东西归类为“异常”。
1:从第二个值开始,如果第二个值在第一个值的接近范围内,则在第三列标记为“N”表示正常。以此类推,通过其余的数据集。
2:若第二个值与第一个值相比大幅增加或减少,则将第三列异常标记为“A”。
3:如果一个值被标记为“A”,那么后面的值将被标记为“A”,如果它在之前的异常值的一个小范围内。如果后面的值比上一个异常值有较大的增加或减少,则标记为“N”。
这是我能想到的最好的逻辑,但是如果你能想出一个更好的主意,请查看下面的数据。
所以给定一个虚拟数据集:
SampleNum<-1:50
Value <- c(1, 2, 2, 2, 23, 22, 2, 3, 2, -23, -23, 4, 4, 5, 5, 25, 24,
6, 7, 6, 35, 38, 20, 21, 22, -22, 2, 2, 6, 7, 7, 6, 30, 31,
6, 6, 6, 5, 22, 22, 4, 5, 4, 5, 30, 39, 18, 18, 19, 18)
DF<-data.frame(SampleNum,Value)
这就是我看到最终数据的方式,第三列标识哪些值是异常的。
SampleNum Value Name
1 1 N
2 2 N
3 2 N
4 2 N
5 23 A
6 22 A
7 2 N
8 3 N
9 2 N
10 -23 A
11 -23 A
12 4 N
13 4 N
14 5 N
15 5 N
16 25 A
17 24 A
18 6 N
19 7 N
20 6 N
21 35 A
22 38 A
23 20 N
24 21 N
25 22 N
26 -22 A
27 2 N
28 2 N
29 6 N
30 7 N
31 7 N
32 6 N
33 30 A
34 31 A
35 6 N
36 6 N
37 6 N
38 5 N
39 22 A
40 22 A
41 4 N
42 5 N
43 4 N
44 5 N
45 30 A
46 39 A
47 18 N
48 18 N
49 19 N
50 18 N
【问题讨论】:
-
按照您的规则,第 2 行应该是异常,因为值 2 表示(至少)从值 1 增加/减少 50%(即增加 100%) .
-
你是对的。也许百分比增加或减少并不是表征数据大幅跳跃的最佳方式。编辑问题以删除对 % 的引用
标签: r if-statement