我正在使用“ 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
中保存的数据帧相同,但是要么不使用打印命令,要么使用打印命令“静默地”(不打印输出)。
非常感谢您的帮助,让我知道是否忘记了可以回答问题的内容!
答案 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