由另一个问题引出:
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$ at )at "2012-10-01 09:11:00“
有各种各样的模式。数据是在给定时间在给定天线上检测到的信号,但为了保持问题的开放性,我将其简化为上文所述。因此,模式是1, 2,2,1,即在天线1上检测,然后是2,2,2,最后是1(在天线柱中)。在我的数据中,当这种模式发生时,它表明了动物的行为运动。如果我能够识别它,我就可以对它进行更多的计算。
上面的代码表示当一个数字重复4次时,它无法识别彼此不同的4个数字的重复: 1,2,2,1
这个序列(1,2,2,1)可能会在数据中出现多次,我希望每次都能识别出来。
发布于 2013-03-11 07:42:08
暴力解决方案:
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
zoo
有rollapply
,它可以用来做以下事情:
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
发布于 2013-03-11 07:55:30
如果你事先不知道模式是什么(这是我最初从你的问题中得到的),那么这里有一个暴力解决方案,它将找到给定长度的重复模式:
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的答案中。
https://stackoverflow.com/questions/15328925
复制相似问题