说我有一系列数字:
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)
答案 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
类似的方法,但这完全取决于用户的偏好。