【问题标题】:Number sequence recognition数列识别
【发布时间】:2013-03-10 23:15:11
【问题描述】:

从另一个问题开始:

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,即在 Aerial 1 处检测,然后是 2,然后是 2,然后是 1(在 Aerial 列中)。在我的数据中,当这种模式出现时,它表明动物的行为运动。如果我能够识别它,我就可以对其进行更多的计算。

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

这个序列 (1,2,2,1) 可能在数据中出现多次,我想每次都识别它。

【问题讨论】:

  • 你的问题我还不清楚。你能用一个适当的例子来详细说明......它与那个帖子有什么不同?如果您希望得到好的答案,您应该真正花时间来阐述您的问题。
  • 也许对您正在尝试解决的问题的描述将有助于澄清事情...您是否有一组正在寻找的模式?你如何确定它们?
  • 你给了我们数据。好的!但是你的问题还不清楚。我认为您正在寻找从数字 1 到 2、2 到 1、1 到 2 和 2 到 1 在位置 11、13、15、17 的过渡?如果是这样,试试这个:which(c(0, diff(d$Aerial)) != 0)(或head(cumsum(rle(d$Aerial)$lengths)+1, -1))。如果没有,请再次编辑您的问题以更清楚地解释。
  • 有多种模式,数据是在给定天线上给定时间的信号检测,但为了保持问题开放,我已将其简化为如上,所以模式是 1,2, 2,1 即在 Aerial 1,然后 2,然后,2,然后 1(在 Aerial 列中)进行检测。在我的数据中,当这种模式出现时,它表明动物的行为运动。如果我能够识别它,我可以对其进行更多计算
  • 那么,在c(1, 2, 2, 1)第一次出现之后,c(1, 2, 2, 1)的任何更多出现应该被视为“重复序列”吗?似乎除非您有更多限制,否则您必须识别数据中每个 4+ 长度的序列,并搜索它们的重复。我怀疑这方面的搜索空间会很大,如果没有更多限制,这将是不可能的。

标签: r


【解决方案1】:

暴力破解:

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

【讨论】:

    【解决方案2】:

    如果您事先不知道模式将是什么(这是我最初从您的问题中得到的),那么这里有一个蛮力解决方案,可以找到给定长度的重复模式:

    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 的答案中。

    【讨论】:

    • 啊,我明白了!谢谢,是的,我已经知道模式,因为模式意味着特定的行为!
    猜你喜欢
    • 2013-12-15
    • 1970-01-01
    • 1970-01-01
    • 2018-04-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多