将熔化的表格更改回表格

时间:2018-06-08 15:44:32

标签: r melt

泰坦尼克号是 R 中的数据集,其类别为" table"。 dim(Titanic)告诉它是4维的。 现在,如果我做了

x <- Titanic
y <- melt(x)

y看起来像一个二维数据框。 我的问题是,如何将y改回x?我能得到的最接近的是

z <- table(y)

但是那时z是5维的。

有人能帮帮我吗?

2 个答案:

答案 0 :(得分:1)

我无法找到现有功能来执行此操作。但是,在使用dput查看reshape2::melt(Titanic)的输出后,我们可以使用其中的部分内容并将正确的内容提供给reshape2::acast至&#34; unmelt&#34;表:

library(reshape2)

unmelt_table <- function(melted_table, value.name = "value") {

  premelt_dimnames <- names(melted_table)[names(melted_table) != value.name]
  premelt_dimlabels <- sapply(premelt_dimnames, function(n)
    levels(getElement(melted_table, n))
  )
  formula_colnames <- rev(premelt_dimnames)
  recast_formula <- as.formula(paste0(". ~ ", paste(formula_colnames, collapse = " + ")))
  premelt_vec <- as.vector(acast(melted_table, recast_formula))
  structure(premelt_vec, 
            .Dim = as.vector(sapply(premelt_dimlabels, length)),
            .Dimnames = premelt_dimlabels,
            class = "table")
}

要验证它是否有效,请运行以下命令:

> identical(Titanic, unmelt_table(melt(Titanic)))
[1] TRUE

答案 1 :(得分:1)

melt的结果reshape2::melt(Titaninc)没有多少。与as.data.frame(Titanic)的结果进行比较。唯一的区别是&#39;数字&#39;专栏(value vs Freq)。

通过执行class(Titanic)?table,您会发现Titanic是来自table()函数的数据类型。在文档中,您还可以注意到有xtabs,基于公式的制表界面。在xtabs个文档中,formula参数说明

  

......在左侧,可以选择性地给出一个向量或一个计数矩阵;在后一种情况下,列被解释为对应于变量的级别。如果数据已经制表,那么这很有用......

这让你有一个简单的

dt <- as.data.frame(Titanic)
xtabs( Freq ~ Class + Sex + Age + Survived, data = dt )

重建table分类数据,如果您需要其他包作为输入。

Tto加上我的两分钱,使用交叉表以简单的二维data.frame或更好tibble来自tidyverse更加明智!