【问题标题】:Reshaping a "vector" from long to wide将“矢量”从长变宽
【发布时间】:2017-06-15 06:26:45
【问题描述】:

我有一个带有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 的数据转换here 可用。)不过,宽格式比长格式整洁得多:

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

【问题讨论】:

  • 转换为data.frame,然后使用“标准”整形工具?
  • 通常将不等长度的向量放入 data.frame 不是一个好主意。如果您真的必须这样做,请参阅this 了解一些选项。
  • 通过更好的呈现方式?,你是什么意思?如何呈现数据?或者如何呈现数据的重塑?
  • res 既不是向量也不是两列矩阵。使用str 检查您实际拥有的内容。

标签: r reshape reshape2 cbind


【解决方案1】:

我会使用 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')
  )
)

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

【讨论】:

  • 感谢您提供此解决方案!这就是(我相信)我正在寻找的东西。我可以检查一下这种交互性是否保留在导出为 HTML 的 .Rmd R Markdown 文件中?
  • 当然。它可以用作降价、flexdashboard、闪亮的应用程序等。您可以在此处查看示例:rstudio.github.io/DT
【解决方案2】:

如果您只是在寻找更简洁的代码,也许这会让您满意?

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>

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-03-20
    • 2018-05-05
    • 1970-01-01
    • 2016-01-24
    • 1970-01-01
    • 2020-06-22
    • 1970-01-01
    相关资源
    最近更新 更多