2013-03-10 48 views
5

从另一个问题制定有关:数字序列识别

Identifying sequences of repeated numbers in R

我已经使用从这个问题的答案我的数据,而不是一个问题中识别序列,但是我坚持,当谈到识别序列的不同的数字,例如:序列也许:126,126,25而不是重复的数字,

我目前正在使用的代码是相同的如上述的问题(RLE)

样品d ATA:

d<-read.table(text='Date.Time Aerial 
794 "2012-10-01 08:18:00"  1 
795 "2012-10-01 08:34:00"  1 
796 "2012-10-01 08:39:00"  1 
797 "2012-10-01 08:42:00"  1 
798 "2012-10-01 08:48:00"  1 
799 "2012-10-01 08:54:00"  1 
800 "2012-10-01 08:58:00"  1 
801 "2012-10-01 09:04:00"  1 
802 "2012-10-01 09:05:00"  1 
803 "2012-10-01 09:11:00"  1 
1576 "2012-10-01 09:17:00"  2 
1577 "2012-10-01 09:18:00"  2 
804 "2012-10-01 09:19:00"  1 
805 "2012-10-01 09:20:00"  1 
1580 "2012-10-01 09:21:00"  2 
1581 "2012-10-01 09:23:00"  2 
806 "2012-10-01 09:25:00"  1 
807 "2012-10-01 09:32:00"  1 
808 "2012-10-01 09:37:00"  1 
809 "2012-10-01 09:43:00"  1', header=TRUE, stringsAsFactors=FALSE, row.names=1) 

代码,将识别号码的重复序列(相同数量的重复4次):

tmp <- rle(d$Aerial) 
d$newCol <- rep(tmp$lengths>=4, times = tmp$lengths) 

但是我不知道如何识别含有不同数量的序列,例如序列可以是:1,2,2,1(如在d $天线中)在“2012-10-01 09:11:00”

有各种模式。这些数据是在给定的天线上给定时间的信号检测,但为了保持问题的开放性,我已经按上述简化了它。因此该模式为1,2,2,1,即在天线1,然后2,然后2,然后1(在空中列中)进行检测。在我的数据中,当这种模式发生时,它表示动物的行为运动。如果我能够识别它,那么我可以对它进行更多的计算。

上面的代码表示当一个数值重复4次,但它无法识别4个数字,其是彼此不同的重复:1,2,2,1

该序列(1,2 ,2,1)可能会在数据中出现多次,我希望每次都能识别它。

+2

你的问题还不清楚。你能否详细说明一个恰当的例子......以及它与那篇文章有何不同?如果你希望得到好的答案,你应该*真的需要时间来制定你的问题。 – Arun 2013-03-10 23:17:02

+0

道歉,请参阅编辑 – 2013-03-10 23:28:30

+0

也许您正在尝试解决的问题的描述将有助于澄清事情......您是否有一组要查找的模式?你如何确定他们? – Justin 2013-03-10 23:28:56

回答

4

蛮力解决方案:

pat <- c(1,2,2,1) 
x <- sapply(1:(nrow(d)-length(pat)), function(x) all(d$Aerial[x:(x+length(pat)-1)] == pat)) 

d[which(x),] # "which" prevents recycling of the shorter vector "x" 
##    Date.Time Aerial 
## 803 2012-10-01 09:11:00  1 
## 805 2012-10-01 09:20:00  1 

zoorollapply可以用于此:

require(zoo) 
x <- rollapply(d$Aerial, length(pat), FUN=function(x) all(x == pat)) 

d[which(x),] 
##    Date.Time Aerial 
## 803 2012-10-01 09:11:00  1 
## 805 2012-10-01 09:20:00  1 

对于(现已删除)评论,找到匹配的最后一个字符该行的模式:

d[which(x)+length(pat)-1,] 
##    Date.Time Aerial 
## 804 2012-10-01 09:19:00  1 
## 806 2012-10-01 09:25:00  1 
+0

@Salmosalar我会编辑。 – 2013-03-29 15:54:45

4

如果你不知道模式是什么要在提前(这是我最初采取从你的问题),那么这里有一个蛮力解决方案,会发现一个给定长度的重复模式:

pattern_length = 4 
patterns = list() 
for (i in 1:(nrow(d) - pattern_length)) { 
    patterns[[i]] = d$Aerial[i:(i + pattern_length - 1)] 
} 
unique(patterns[duplicated(patterns)]) 

[[1]] 
[1] 1 1 1 1 

[[2]] 
[1] 1 1 2 2 

[[3]] 
[1] 1 2 2 1 

[[4]] 
[1] 2 2 1 1 

然后,您可以养活这些进入马修伦德伯格的答案。

+0

啊我明白了!谢谢,是的,我已经知道模式,因为模式意味着特定的行为! – 2013-03-11 00:14:03