2015-04-12 30 views
0

是否可以從.txt文件加載頻繁子序列列表,並使TraMineR將其識別爲序列對象?從TXT加載頻繁子序列

不幸的是,我沒有原始數據,因此我無法重新創建分析。我唯一的文件是包含頻繁子序列的.txt文件。我假設它是使用TraMineR軟件包中的seqefsub()函數創建的,其中maxGap=2因爲數據看起來像所提到的函數的輸出。

read.table()將其作爲數據框讀取,但據我瞭解,TraMineR將事件序列處理爲具有許多附加屬性的列表,例如該文件中未包含該附加屬性。或者,我不知道如何提取他們...

這是一對夫婦從.txt文件的行什麼樣子:

           Subsequence Support Count 
16           (WT4)-(WT3) 0.76666667 805 
17             (WL2) 0.76380952 802 
18             (S1) 0.76000000 798 
19            (FRF,WL2) 0.74380952 781 
20           (WT2)-(WT1) 0.70571429 741 
+0

爲什麼要保存'seqefsub'爲文本的結果的打印,然後讀回爲序列對象? 'seqefsub'函數已經返回一個事件序列對象。你想將事件序列對象轉換爲狀態序列對象嗎? (如果是,請查看[http://stackoverflow.com/a/28968342/1586731])。請澄清你的問題。 – Gilbert

+0

@吉爾伯特 - 我編輯了我的問題,我希望現在更清楚。 –

回答

1

要從(文本創建一個事件序列對象)子序列,您必須將它們轉換爲垂直時間戳事件(TSE)格式。下面的功能爲您的數據做這項工作

## Function subseq.to.TSE 
## puts the sequences into TSE format using 
## position as timestamp 
## sdf: a data frame with columns Id, Subsequence, Support and Count. 

subseq.to.TSE <- function(sdf){ 
    tse <- data.frame(id=0, event="", time=0) 
    k <- 0 
    for (i in 1:nrow(sdf)){ 
    id <- sdf[i,"Id"] 
    s <- sdf[i,"Subsequence"] 
    ss <- gsub("\\(","",s) 
    ss <- gsub("\\)","",ss) 
    # split transitions 
    st <- strsplit(ss, split="-")[[1]] 
    for (j in 1:length(st)){ 
     stt <- strsplit(st[j], split=",")[[1]] 
     for(jj in 1:length(stt)){ 
     k <- k+1 
     tse[k,1] <- id 
     ## parsing for simultaneous events 
     if (!(stt[jj] %in% levels(tse[,2]))) 
      {levels(tse[,2]) <- c(levels(tse[,2]),stt[jj])} 
     tse[k,2] <- stt[jj] 
     tse[k,3] <- j 
     } 
    } 
    } 

    return(tse) 
} 

以下是您如何使用它的示例數據。

我們首先創建的數據幀,我們命名s.df

s.df <- data.frame(scan(what=list(Id=0, Subsequence="", Support=double(), Count=0))) 
16 (WT4)-(WT3) 0.76666667 805 
17 (WL2) 0.76380952 802 
18 (S1) 0.76000000 798 
19 (FRF,WL2) 0.74380952 781 
20 (WT2)-(WT1) 0.70571429 741 

# leave a blank line to end the scan 

然後我們從s.df提取TSE數據,並從它創建一個使用seqecreate事件序列對象。最後,我們將計數分配爲序列權重。

s.tse <- subseq.to.TSE(s.df) 
seqe <- seqecreate(s.tse) 
seqeweight(seqe) <- s.df[,"Count"] 

現在你可以例如繪製事件序列與

seqpcplot(seqe) 
+0

它完美地工作,謝謝! –