确定R中的数字序列何时被破坏

时间:2015-07-16 19:02:05

标签: r

说我有一系列数字:

seq1<-c(1:20,25:40,48:60)

如何返回一个列出序列被破坏的点的向量,如下所示:

   c(21,24)
    [1] 21 24

   c(41,47) 
    [1] 41 47

感谢您的帮助。

显示我悲惨的失败尝试:

nums<-min(seq1):max(seq1) %in% seq1
which(nums==F)[1]

res.vec<-vector()
counter<-0
res.vec2<-vector()
counter2<-0

for (i in 2:length(seq1)){
  if(nums[i]==F & nums[i-1]!=F){
    counter<-counter+1
    res.vec[counter]<-seq1[i]
  }

  if(nums[i]==T & nums[i-1]!=T){
    counter2<-counter2+1
    res.vec2[counter2]<-seq1[i]
  }


}

cbind(res.vec,res.vec2)

2 个答案:

答案 0 :(得分:3)

我已经改变了一般功能,所以我认为这应该是一个单独的答案。

你可以尝试

seq1<-c(1:20,25:40,48:60)

myfun<-function(data,threshold){
   cut<-which(c(1,diff(data))>threshold)
   return(cut)
}

您可以使用

获得必须关注的要点
myfun(seq1,1)
[1] 21 37

为了更好地使用,方便用它创建一个对象。

pru<-myfun(seq1,1)

所以你现在可以打电话了

df<-data.frame(pos=pru,value=seq1[pru])
df
  pos value
1  21    25
2  37    48

您将获得一个数据框,其中包含制动器的位置和值以及您所需的阈值。如果你想要一个列表而不是一个数据框,它的工作原理如下:

list(pos=pru,value=seq1[pru])
$pos
[1] 21 37

$value
[1] 25 48

答案 1 :(得分:2)

函数diff将为您提供连续值之间的差异

> x <- c(1,2,3,5,6,3)
> diff(x)
[1] 1 1 2 1 -3

现在查找序列中“断点”不等于1的值。

考虑到这里的评论。出于一般目的,您可以使用。

fun<-function(data,threshold){
   t<-which(c(1,diff(data)) != threshold)
   return(t)
}

考虑data可以是任何数字向量(例如数据框列)。我也会考虑使用grep类似的方法,但这完全取决于用户的偏好。