在r中同时检测多个变量的急剧爆发

  • 本文关键字:变量 爆发 r dplyr tidyr
  • 更新时间 :
  • 英文 :


我尽量说清楚。这里的数据

dt=structure(list(x1 = c(28.5, 25.5, 28, 27, 29), x2 = c(28.5, 25.5, 
25, 25.5, 29), x3 = c(8, 5.5, 8.5, 7.5, 8), x4 = c(8.5, 6.5, 
6.5, 5.5, 8), x5 = c(64L, 55L, 54L, 55L, 60L), x6 = c(63.5, 54.5, 
53.5, 54.5, 60), x7 = c(1028L, 1010L, 1008L, 1010L, 1020L), x8 = c(1027L, 
1009L, 1007L, 1009L, 1020L)), class = "data.frame", row.names = c(NA, 
-5L))

我需要找到行在同一时间,最小(至少)2以上变量(x1-x8)的值同时急剧变化。例如,突然和同时(这很重要)成长起来的x2, x4, x8

,不管它们跳了多少,一个同时(对几个变量同时)和突然事件的事实。所以我们可以计算x2=25.5-28.5 = -3

的差值(δ)
x2   x4  x8
1 -3.0 -2.0 -18
2 -0.5  0.0  -2
3  0.5 -1.0   2

一般情况下,前后对于每个变量的差值是均匀的,x8跳得很陡,但是其他的都在它们的范围内,但是有必要一次性全部或者至少2个变量。这一点我们可以在最后一行看到。

4  3.5  2.5  11  changes last row

是否可以将flag = 1设置为我们看到极端增长的行

x1   x2  x3  x4 x5   x6   x7   x8 flag
1 28.5 28.5 8.0 8.5 64 63.5 1028 1027    0
2 25.5 25.5 5.5 6.5 55 54.5 1010 1009    0
3 28.0 25.0 8.5 6.5 54 53.5 1008 1007    0
4 27.0 25.5 7.5 5.5 55 54.5 1010 1009    0
5 29.0 29.0 8.0 8.0 60 60.0 1020 1020    1

如果这是不可能的,那么是否可以设置如果x1-x4中至少有2个变量在2mm上生长,同时变量x7-x8在10mm上生长,则标记1 ?

下面的代码使用Base R方法

(a)。通过apply()命令计算每个列的差异,然后

(b)。对每行计数是否有两个以上变量的绝对变化大于3(阈值),如果是这种情况则设置标志1,否则设置标志0。

当然,你可以将阈值更改为另一个值,例如4或5。

:

threshold <- 3
flags <- dt %>% 
apply(., 2, diff) %>% 
apply(., 1,  
function(x) 
ifelse(length(x[abs(x) > threshold]) > 1, 
1, 
0))
dt$flag <- c(0, flags)
dt

注意,我们总是将标志向量的第一个值设置为0,因为我们不知道t = - 1中的值。

:

x1   x2  x3  x4 x5   x6   x7   x8 flag
1 28.5 28.5 8.0 8.5 64 63.5 1028 1027    0
2 25.5 25.5 5.5 6.5 55 54.5 1010 1009    1
3 28.0 25.0 8.5 6.5 54 53.5 1008 1007    0
4 27.0 25.5 7.5 5.5 55 54.5 1010 1009    0
5 29.0 29.0 8.0 8.0 60 60.0 1020 1020    1

最新更新