重塑“向量”从长到宽

时间:2017-06-15 06:26:45

标签: r reshape reshape2 cbind

我有一个rownames的向量,因此它可以被视为一个带有2列的“矩阵”(一个用于文件名,一个用于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 ,可用{{3}但是,宽格式比长格式更整洁:

              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文件中用于演示目的,还有其他更好的方式来呈现吗?

2 个答案:

答案 0 :(得分:2)

我将使用DT包在markdown中创建一个交互式表。 Link to vignette

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

探索小插图,它有很多选项,例如:使用颜色和形状格式化字段,使用户能够交互地添加或删除列,在广泛的表格中sc,等等。

答案 1 :(得分:1)

如果您只是在寻找更多更清洁的代码,那么这可能会让您满意吗?

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>