Изменение формы вектора с длинного на широкий

У меня есть вектор с rownames, поэтому его можно рассматривать как «матрицу» с двумя столбцами (один для имени файла, один для Topic):

> res
                   Topic
jardine-1.docx.md      1
jardine-2.docx.md      1
jardine-a1.docx.md     1
jardine-a2.docx.md     1
jardine-a3.docx.md     1
jardine-a4.docx.md     3
jardine-a5.docx.md     1
jardine-a6.docx.md     3
jardine-a7.docx.md     3
jardine-a8.docx.md     1
...

Это результаты работы замечательного пакета R по тематическому моделированию, метко названного topicmodels.

Я хочу cast преобразовать этот "вектор" в широкий формат только для презентационных целей.

Это, конечно, нарушает принципы «аккуратных данных», где «каждое наблюдение или случай находится в отдельной строке» (см. Преобразование данных с помощью dplyr, доступное здесь.) Тем не менее, широкий формат намного аккуратнее длинного:

              Topic1       Topic2             Topic3
1  jardine-1.docx.md jk-1.docx.md jardine-a4.docx.md
2  jardine-2.docx.md jk-2.docx.md jardine-a6.docx.md
3 jardine-a1.docx.md jk-4.docx.md jardine-a7.docx.md
4 jardine-a2.docx.md jk-5.docx.md  singtel-1.docx.md
5 jardine-a3.docx.md jk-6.docx.md  singtel-2.docx.md
6 jardine-a5.docx.md         <NA>  singtel-3.docx.md
7 jardine-a8.docx.md         <NA>  singtel-4.docx.md
8       jk-3.docx.md         <NA>  singtel-5.docx.md
9       jk-7.docx.md         <NA>               <NA>

Это, конечно, можно сделать разными способами, один из которых выглядит так (предупреждение: некрасиво)

# via cbind
T1=rownames(subset(res, Topic==1))
T2=rownames(subset(res, Topic==2))
T3=rownames(subset(res, Topic==3))
n=max(length(T1),length(T2),length(T3))
length(T1) <- n
length(T2) <- n
length(T3) <- n
cbind(T1,T2,T3)

Мой вопрос:

Есть ли другие лучшие способы представить это, учитывая, что весь код будет находиться в файле R Markdown для целей презентации?


person hongsy    schedule 15.06.2017    source источник
comment
Преобразовать в data.frame, а затем использовать стандартные инструменты изменения формы?   -  person talat    schedule 15.06.2017
comment
Возможный дубликат stackoverflow.com/questions/2185252   -  person zx8754    schedule 15.06.2017
comment
Как правило, не рекомендуется помещать векторы разной длины в data.frame. См. это для некоторых вариантов, если вам действительно нужно это сделать.   -  person Adam Quek    schedule 15.06.2017
comment
Что вы имеете в виду под лучшими способами представления этого?? Как представить данные? Или как представить изменение формы данных?   -  person psychOle    schedule 15.06.2017
comment
res не является ни вектором, ни матрицей с двумя столбцами. Используйте str, чтобы проверить, что у вас есть на самом деле.   -  person Roland    schedule 15.06.2017
comment
@herbaman Я имею в виду лучшие способы представления данных. Изменение формы — это последнее средство для компактного отображения всех элементов.   -  person hongsy    schedule 19.06.2017


Ответы (2)


Я бы создал интерактивную таблицу в уценке с пакетом DT. Ссылка на виньетку

library(DT)

datatable(
  dataframe, class = 'cell-border stripe', extensions = c('Buttons', 'FixedColumns'), options = list(
    dom = 'Bfrtip', scrollX = TRUE, fixedColumns = TRUE,
    buttons = c('copy', 'csv', 'excel', 'pdf', 'print')
  )
)

Изучите виньетку, у нее есть множество опций, таких как: форматирование полей с цветами и формами, возможность интерактивного добавления или удаления столбцов, просмотр широких таблиц и т. Д.

person Prometheus    schedule 15.06.2017
comment
спасибо за это решение! это (я верю) то, что я ищу. Могу ли я проверить, сохраняется ли эта интерактивность в файле .Rmd R Markdown, экспортированном в HTML? - person hongsy; 19.06.2017
comment
Конечно. Он будет работать как уценка, flexdashboard, блестящее приложение и т. д. Вы можете увидеть примеры здесь: rstudio.github.io /ДТ. - person Prometheus; 19.06.2017

Если вы просто ищете более чистый код, может быть, это вас удовлетворит?

nmax <- max(table(res$Topic))
ntopics <- 3 # or ntopics <- max(res$Topic) to be more general
build_col <- function(i){rn <- rownames(subset(res,Topic==i)); rn <- c(rn,rep(NA,nmax-length(rn)))} # you may replace NA by "" here for it to look nicer
sapply(1:ntopics,build_col) %>% as.data.frame %>% setNames(paste0("Topic",1:ntopics))

#               Topic1 Topic2             Topic3
# 1  jardine-1.docx.md   <NA> jardine-a4.docx.md
# 2  jardine-2.docx.md   <NA> jardine-a6.docx.md
# 3 jardine-a1.docx.md   <NA> jardine-a7.docx.md
# 4 jardine-a2.docx.md   <NA>               <NA>
# 5 jardine-a3.docx.md   <NA>               <NA>
# 6 jardine-a5.docx.md   <NA>               <NA>
# 7 jardine-a8.docx.md   <NA>               <NA>
person Moody_Mudskipper    schedule 15.06.2017