如何强制 stslist.freq 到数据框

How to coerce stslist.freq to dataframe

我正在使用 "TraMineR" 库进行一些描述性序列分析。我想通过 R-Markdown 以 html 格式报告我的发现。对于格式化表格,我使用 "kable" 和 "kableExtra"。 为了获得最常见序列的频率和比例,我使用 seqtab()。结果是一个 stslist.freq 对象。当我尝试将其强制转换为数据框时,该数据框不包含任何频率和比例。

我尝试打印 seqtab() 的结果并再次存储此结果。这给了我我想要的数据框。但是有两个 "problems" :(1)我不明白这里发生了什么,这似乎是一个 "dirty" 把戏,(2)结果我也得到了打印的输出如果我不将代码分成多个块并禁用特定块中的输出,我最终 html 文档中的命令。

这里是一些重现问题的代码:

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))

我希望数据帧与 seqtab.df2 中保存的数据帧相同,但是要么不使用打印命令,要么使用打印命令 "silently"(未打印输出)。

非常感谢您的帮助,如果我忘记了一些可以回答问题的内容,请告诉我!

如果您查看 seqtab 返回的对象的 class(),它的类型为

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

因此,如果我们确切地查看此类对象的 print 语句中发生了什么,我们就可以了解发生了什么

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>

我们看到它真正为您提供的是 "freq" 属性。您可以直接提取它并跳过 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