Creating a sequence object from SPELL data

2019-03-29 15:21发布

I am trying to create a sequence object with seqdef using SPELL format. Here is an example of my data:

spell <- structure(list(ID = c(1, 3, 3, 4, 5, 5, 6, 8, 9, 10, 11, 11, 
12, 13, 13, 13, 13, 14, 14, 14, 14, 14, 14, 14, 14, 14, 15, 15, 
15, 15, 15, 15, 15, 16, 16, 16, 16, 17, 17, 17, 18, 18, 18, 19, 
19), status = c(1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 
1, 1, 2, 3, 1, 2, 3, 2, 3, 1, 1, 1, 3, 1, 3, 3, 1, 3, 1, 1, 1, 
1, 1, 3, 3, 1, 3, 1, 1, 1), time1 = c(1, 1, 57, 1, 1, 91, 1, 
1, 1, 1, 1, 104, 1, 1, 60, 109, 121, 1, 42, 47, 54, 64, 72, 78, 
85, 116, 1, 29, 39, 69, 74, 78, 88, 1, 16, 40, 68, 1, 30, 123, 
1, 39, 51, 1, 61), time2 = c(125, 57, 125, 125, 91, 125, 125, 
125, 125, 125, 104, 125, 125, 60, 109, 121, 125, 42, 47, 54, 
64, 72, 78, 85, 116, 125, 29, 39, 69, 74, 78, 88, 125, 16, 40, 
68, 125, 30, 123, 125, 39, 51, 125, 61, 125)), .Names = c("ID", 
"status", "time1", "time2"), row.names = c(NA, 45L), class = "data.frame")

When I try to define the sequence object, a strange error is thrown:

spell.seq <- seqdef(data=spell, informat="SPELL", id="ID", begin="time1", end="time2", 
                    status="status", limit=125,process=FALSE)

 [>] time axis: 1 -> 125
 [>] SPELL data converted into 17 STS sequences
 [>] 3 distinct states appear in the data: 
     1 = 1
     2 = 2
     3 = 3
 [>] state coding:
       [alphabet]  [label]  [long label] 
     1  1           1        1
     2  2           2        2
     3  3           3        3
 [>] 17 sequences in the data set
 [>] min/max sequence length: 125/125
Error in `row.names<-.data.frame`(`*tmp*`, value = value) : 
  invalid 'row.names' length

However, if I do the same indirectly via seqformat, preserving the same arguments, no error is thrown:

sts <- seqformat(data=spell,from="SPELL",to="STS",
                 id="ID",begin="time1",end="time2",status="status",
                 limit=125,process=FALSE)

seqs <- seqdef(sts,right="DEL")

Using TraMineR 1.8-5 with R 3.0.0 Windows 7 64-bit. Is this a bug or am I doing something wrong? Thanks in advance.

标签: r traminer
1条回答
欢心
2楼-- · 2019-03-29 15:34

A quick look at the source of seqdef() for how the row.names are set shows they are set based on the value of the id argument.

Looking in ?seqdef for id shows

id
optional argument for setting the rownames of the sequence object. If NULL (default), the rownames are taken from the input data. If set to "auto", sequences are numbered from 1 to the number of sequences. A vector of rownames of length equal to the number of sequences may be specified as well.

From the example in the question you are passing id="ID" which does not meet these criteria. Changing this to id=NULL allows the command to complete as expected and a check for equality using identical( spell.seq, seqs) yields true.

查看更多
登录 后发表回答