Как заставить stslist.freq к dataframe - PullRequest
2 голосов
/ 25 марта 2019

Я делаю некоторый описательный анализ последовательности с использованием библиотеки "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 Ответ

2 голосов
/ 25 марта 2019

Если вы посмотрите на class() объекта, возвращаемого seqtab, он имеет тип

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