让T={t|t=1,2,3..T}
为时间(序列顺序号)对于每个组,在每个t
当/如果序列发生时,我们需要确保序列(它是一个数字,让&# 39; s假设它是X
}在{K-1,K,K+1
}的集合中,其中K
是t-1
处的先前序列号。例如,如果先前的序列号K = 4,则对于下一个序列X,如果X落在[3,4,5]内。然后这个X符合要求。如果序列中的每个X都满足要求,则该组符合要求并将其标记为TRUE。
我知道for循环可以做到这一点,但我有大量的观察,在循环中进行它是非常慢的。我知道cummax
可以帮助您快速找到非死亡序列。我想知道是否有像cummax
这样的快速解决方案。
seq <- c(1,2,1,2,3,1,2,3,1,2,1,2,2,3,4)
group <- rep(letters[1:3],each=5)
dt <- data.frame(group,seq)
> dt
group seq
1 a 1
2 a 2
3 a 1
4 a 2
5 a 3
6 b 1
7 b 2
8 b 3
9 b 1
10 b 2
11 c 1
12 c 2
13 c 2
14 c 3
15 c 4
所需的输出:
y label
a:true
b:false
c:true
答案 0 :(得分:3)
您可以使用diff
函数检查相邻序列是否满足条件:
library(dplyr)
dt %>% group_by(group) %>% summarize(label = all(abs(diff(seq)) <= 1))
# A tibble: 3 x 2
# group label
# <fctr> <lgl>
#1 a TRUE
#2 b FALSE
#3 c TRUE
以下是相应的data.table
版本:
library(data.table)
setDT(dt)[, .(label = all(abs(diff(seq)) <= 1)), .(group)]
答案 1 :(得分:2)
你可以这样做:
{{1}}
答案 2 :(得分:1)
以下是aggregate
和diff
aggregate(c(1, abs(diff(dt$seq)) * (tail(dt$group, -1) ==
head(dt$group, -1))),
dt["group"], function(i) max(i) < 2)
group x
1 a TRUE
2 b FALSE
3 c TRUE
aggregate
的第一个参数是一个向量,它使用diff
并根据当前相邻向量元素是否在同一组中来打开和关闭结果(为零)。
答案 3 :(得分:1)
我们也可以使用aggregate
base R
aggregate(seq~group,dt, FUN = function(x) all(c(TRUE,
abs((x[-1] - x[-length(x)])) <=1)))
# group seq
#1 a TRUE
#2 b FALSE
#3 c TRUE