如何将stslist.freq强制转换为数据框

时间:2019-03-25 15:23:46

标签: r dataframe r-markdown traminer

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

我试图打印seqtab()的结果并再次存储该结果。这给了我想要的数据框。但是,这里有两个“问题”:(1)我不明白这里发生了什么,这似乎是一个“肮脏”的把戏,(2)结果,我也获得了最终命令中print命令的输出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中保存的数据帧相同,但是要么不使用打印命令,要么使用打印命令“静默地”(不打印输出)。

非常感谢您的帮助,让我知道是否忘记了可以回答问题的内容!

1 个答案:

答案 0 :(得分:2)

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

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

因此,如果我们确切地看一下,此类对象的打印语句中发生了什么,我们可以了解发生了什么情况

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