数字序列识别

时间:2013-03-10 23:15:12

标签: r

从另一个问题开始:

Identifying sequences of repeated numbers in R

我已经使用该问题的答案来识别我的数据中的序列,而不是问题,但是在识别不同数字的序列时我被困住了,例如:序列可能是:126,126,25而不是重复数字,

我目前使用的代码与上述问题(rle)相同

示例数据:

   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 $ Aerial中)“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 个答案:

答案 0 :(得分: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

答案 1 :(得分: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

然后你可以将这些提供给Matthew Lundberg的答案。