首页 文章

查找序列中的特定模式

提问于
浏览
5

我正在使用R包TraMineR进行一些学术研究序列分析 .

我想找到一个模式,定义为某人在目标公司,然后出去,然后回到目标公司 .

(简化)我将州A定义为目标公司; B作为外部工业公司,C作为内部工业公司 .

所以我想要做的是找到具有特定模式A-B-A或A-C-A的序列 .

在查看此问题(Strange number of subsequences?)并阅读用户指南后,特别是以下段落:

4.3.3子序列如果u的所有连续元素ui以相同的顺序出现在x中,则序列u是x的子序列,我们简单地用u x表示 . 根据这个定义,非共享>状态可以出现在序列u和x两者之间 . 例如,u = S; M是x = S的>子序列; U;米; MC .

7.3.2查找具有给定子序列的序列seqpm()函数计算包含给定子序列的序列数并收集其行索引号 . 该函数返回包含两个元素的列表 . 第一个元素MTab只是一个表,其中包含数据中给定子序列的出现次数 . 请注意,即使子序列在序列中出现多次,每个序列也只计算一次出现次数 . 列表的第二个元素MIndex给出包含子序列的序列的行索引号 . 这些索引号可用于访问相关序列(下面的示例) . 由于在字符串中搜索模式更容易,因此当使用带有TRUE选项的seqconc函数时,函数rst会以此格式转换序列数据 .

我得出结论,seqpm()是我完成工作所需的功能 .

所以我有如下序列:A-A-A-A-A-B-B-B-B-B-A-A-A-A-A

而且,根据我在mentiod源上发现的子序列的定义,我想通过使用我可以找到那种序列:

seqpm(sequence,"ABA")

但这不会发生 . 为了找到我需要输入的示例序列

seqpm(sequence,"ABBBBBA")

这对我需要的东西不是很有用 .

  • 所以你们看到我可能错过了哪些东西?

  • 如何检索从A到B和返回A的所有序列?

  • 有没有办法让我找到从A到其他任何东西再回到A?

非常感谢 !

1 回答

  • 3

    seqpm 帮助页面的 Headers 是"Find substring patterns in sequences",这就是函数实际执行的操作 . 它搜索包含给定子字符串(而不是子序列)的序列 . 似乎用户指南中存在配方错误 .

    找到包含给定子序列的序列的解决方案是使用 seqecreate 将状态序列转换为事件序列,然后使用 seqefsubseqeapplysub 函数 . 我使用 TraMineR 附带的 actcal 数据来说明 .

    library(TraMineR)
    data(actcal)
    actcal.seq <- seqdef(actcal[,13:24])
    
    ## displaying the first state sequences
    head(actcal.seq)
    
    ## transforming into event sequences
    actcal.seqe <- seqecreate(actcal.seq, tevent = "state", use.labels=FALSE)
    
    ## displaying the first event sequences
    head(actcal.seqe)
    
    ## now searching for the subsequences
    subs <- seqefsub(actcal.seqe, strsubseq=c("(A)-(D)","(D)-(B)"))
    ## and identifying the sequences that contain the subsequences
    subs.pres <- seqeapplysub(subs, method="presence")
    head(subs.pres)
    
    ## we can now, for example, count the sequences that contain (A)-(D)
    sum(subs.pres[,1])
    ## or list the sequences that contain (A)-(D)
    rownames(subs.pres)[subs.pres[,1]==1]
    

    希望这可以帮助 .

相关问题