I am creating an event sequence using Traminer seqecreate function. However, the events that occur at the same time are reordered alphabetically in created the event sequence object.
The data is ordered by sequence of occurring events however on creating the event sequence object the events taking place at the same time are reordered alphabetically.
I can manually combine events that happen at the same time, however just wanted to ask how to ensure seqecreate doesn't reorder the events
library("dplyr")
library("TraMineR")
# DATA
eventDat <- data.frame(id = c(rep(1,4), rep(2,10), rep(3,12)),
timeframe = c(rep(0,3),1,rep(0,3),rep(458,3),rep(558,2),559,560,
rep(0,3),8,rep(48,3),57,169,170,511,546),
event = c("I01,I02,I03,I17,I05,I16","T222,T511,T30,T12","noProc",
"apcdischarge","I01","T222,T221,T53","aedischarge",
"I03,I05,I06","T222,T511,T30,T17","aedischarge",
"I01,I02,I03,I05,I16,I14,I17,I07,I06",
"T222,T516,T291,T30","M472","apcdischarge",
"I01,I02,I05,I03","T12,T25,T30,T222,T291",
"noProc","apcdischarge","I01,I02,I05,I03,I17",
"T222,T221,T511,T30","noProc","apcdischarge",
"noProc","apcdischarge","E852,E851,U201","apcdischarge"
))
seqDat<- seqecreate(id=eventDat$id,
timestamp=eventDat$timeframe,
event=eventDat$event)
seqDat[1]
#Warning message:
# In seqecreate.internal(data = data, id = id, timestamp = timestamp, :
# [!] some of your events contain '(', ')' or ',' characters.
# The search of specific subsequences may not work properly.
# remove commas
# Fix events contain '(', ')' or ',' characters
eventDat <- eventDat %>%
rowwise()%>%
mutate(eventF = paste0(trimws(strsplit(as.character(event), ",")[[1]], "b"),
collapse = "."))
#order by ID and time frame
eventDat <- eventDat %>%
arrange(id, timeframe)
seqDat<- seqecreate(id=eventDat$id,
timestamp=eventDat$timeframe,
event=eventDat$eventF)
seqDat[1]
The output being produced is
(I01.I02.I03.I17.I05.I16,noProc,T222.T511.T30.T12)-1-(apcdischarge)
However I expect
(I01.I02.I03.I17.I05.I16,T222.T511.T30.T12,noProc)-1-(apcdischarge)
When not a factor, the event
argument of seqecreate
is coerced into a factor by ordering the levels alphabetically by default. You can set your own order by the passing a self defined factor with the wanted level order as event argument.
I illustrate with your example:
We retrieve the current level order and set the "noProc" event as the last element
ev.list <- levels(factor(eventDat$eventF))
ev.alph <- c(ev.list[ev.list!="noProc"],"noProc")
Now we define the factor using the wanted order of the alphabet of events and pass it as event
argument
event <- factor(eventDat$eventF, levels=ev.alph)
seqDat<- seqecreate(id=eventDat$id,
timestamp=eventDat$timeframe,
event=event)
seqDat[1]
## [1] (I01.I02.I03.I17.I05.I16,T222.T511.T30.T12,noProc)-1-(apcdischarge)