查找数字序列按组在一个相邻的数字(上一个和下一个)内

时间:2016-07-28 21:50:43

标签: r data.table dplyr

T={t|t=1,2,3..T}为时间(序列顺序号)对于每个组,在每个t当/如果序列发生时,我们需要确保序列(它是一个数字,让&# 39; s假设它是X}在{K-1,K,K+1}的集合中,其中Kt-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

4 个答案:

答案 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)

以下是aggregatediff

的基础R示例
    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