我尽量说清楚。这里的数据
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