Search code examples
rdataframer-markdowntraminer

How to coerce stslist.freq to dataframe


I am doing some describtive sequence analysis using the "TraMineR" library. I want to report my findings via R-Markdown in html format. For formating tables I use "kable" and "kableExtra". To get the frequency and propotions of the most common sequences I use seqtab(). The result is an stslist.freq object. When I try to coerce it to a dataframe, the dataframe is not containing any frequencies and proportions.

I tried to print the results of seqtab() and store this result again. This gives me the dataframe I desire. However there are two "problems" with that: (1) I don't understand what is happening here and it seems like a "dirty" trick, (2) as a result I also get the output of the print command in my final html document if I don't split the code in multiple chunks and disable the ouput in the specific chunk.

Here is some code to replicate the problem:

library("TraMineR")

#Data creation
data.long  <- data.frame(
  id=rep(1:50, each=4),
  time = c(0,1,2,3),
  status = sample(letters[1:2], 200, replace = TRUE),
  weight=rep(runif(50, 0, 1), each=4)
)

#reshape
data.wide <- reshape(data.long, v.names = "status", idvar="id", direction="wide", timevar="time")

#sequence
sequence <- seqdef(data.wide,
                   var=c("status.0", "status.1", "status.2", "status.3"), 
                   weights=data.wide$weight)

#frequencies of sequences
##doesn't work:
seqtab.df1 <- as.data.frame(seqtab(sequence)) 

##works:
seqtab.df2 <- print(seqtab(sequence))

I expect the dataframe to be the same as the one saved in seqtab.df2, however either without using the print command or with "silently" (no output printed) using the print command.

Thank you very much for your help and let me know if I forgot something to make answering the question possible!


Solution

  • If you look at the class() of the object returned by seqtab, it has the type

    class(seqtab(sequence))
    # [1] "stslist.freq" "stslist"      "data.frame"  
    

    so if we look at exactly, what's happening in the print statement for such an object we can get a clue what's going on

    TraMineR:::print.stslist.freq
    # function (x, digits = 2, width = 1, ...) 
    # {
    #     table <- attr(x, "freq")
    #     print(table, digits = digits, width = width, ...)
    # }
    # <bytecode: 0x0000000003e831f8>
    # <environment: namespace:TraMineR>
    

    We see that what it's really giving you is the "freq" attribute. You can extract this directly and skip the print()

    attr(seqtab(sequence), "freq")
    #                     Freq   Percent
    # a/3-b/1         4.283261 20.130845
    # b/1-a/1-b/2     2.773341 13.034390
    # a/2-b/1-a/1     2.141982 10.067073
    # a/1-b/1-a/1-b/1 1.880359  8.837476
    # a/1-b/2-a/1     1.723489  8.100203
    # b/1-a/2-b/1     1.418302  6.665861
    # b/2-a/1-b/1     1.365099  6.415813
    # a/1-b/3         1.241644  5.835586
    # a/1-b/1-a/2     1.164434  5.472710
    # a/2-b/2         1.092656  5.135360