如何解决数据表中后续或先前值的滚动计算
我有一个数据表DT
,其中有3列Zeit
,Spuer
和Eingriff
。
DT <- data.table(Zeit = c(1,2,3,4,5,6,7,8,9),Spuer = c(45,45,32,25,30,44,34,42,44),Eingriff = c(0,1,0))
我想找出Eingriff == 1
是否为Spuer < 30
的下三个值之一。如果为TRUE,则Eingriff == 1
否则为Eingriff == 0
。对于我的真实数据,我检查Spuer
中接下来的20个或更多的值是否小于30,因此诸如lead(Spuer,1),lead(Spuer,2)等解决方案不是一个好的解决方案。 / p>
我已经尝试使用frollapply
和shift
实现解决方案,但无法使其正常工作。
最终结果应如下所示:
res <- data.table(Zeit = c(1,0))
解决方法
这是使用sapply
的一种选择:
我们首先找出索引Eingriff == 1
,其中每个索引检查any
中的值window
是否小于30。
library(data.table)
window <- 3
inds <- which(DT$Eingriff == 1)
DT[inds,Eingriff := as.integer(sapply(inds,function(x)
any(DT$Spuer[x:(x+window - 1)] < 30)))]
DT
# Zeit Spuer Eingriff
#1: 1 45 0
#2: 2 45 0
#3: 3 32 1
#4: 4 25 0
#5: 5 30 0
#6: 6 44 0
#7: 7 34 0
#8: 8 42 0
#9: 9 44 0
,
这是使用非等额联接的另一种选择:
k <- 3L
DT[,c("start","end") := .(.I,.I + k)]
DT[Eingriff==1L,Eingriff :=
DT[.SD,on=.(start>start,start<=end),by=.EACHI,+any(x.Spuer < 30)]$V1
]
输出:
Zeit Spuer Eingriff start end
1: 1 45 0 1 4
2: 2 45 0 2 5
3: 3 32 1 3 6
4: 4 25 0 4 7
5: 5 30 0 5 8
6: 6 44 0 6 9
7: 7 34 0 7 10
8: 8 42 0 8 11
9: 9 44 0 9 12
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。