Превращение расплавленного стола обратно в стол - PullRequest
0 голосов
/ 08 июня 2018

Титаник - это набор данных в R , класс которого "таблица".dim(Titanic) говорит, что это 4-мерное.Теперь, если я это сделаю,

x <- Titanic
y <- melt(x)

y будет выглядеть как двумерный фрейм данных.У меня вопрос, как я могу изменить у обратно на х?Самый близкий, который я мог получить, был

z <- table(y)

Но тогда z является 5-мерным.

Кто-нибудь может мне помочь?

Ответы [ 2 ]

0 голосов
/ 10 июня 2018

Существует не так много melt ed о результате reshape2::melt(Titaninc).Сравните с результатом as.data.frame(Titanic).Единственное отличие - это имя столбца «цифры» (value против Freq).

Делая class(Titanic) и ?table, вы обнаружите, что Titanic - это тип данных, которые поступаютиз функции table().В документации вы также можете заметить, что существует xtabs, интерфейс на основе формул для табуляции.В xtabs документах, formula аргумент говорит:

... С левой стороны, опционально, можно указать вектор или матрицу отсчетов;в последнем случае столбцы интерпретируются как соответствующие уровням переменной.Это полезно, если данные уже были табулированы, ...

, что оставляет вам простой

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

для восстановления table классифицированных данных, если вы когда-либоон нужен для какого-то другого пакета в качестве входных данных.

Чтобы добавить мои два цента, работать с кросс-таблицей в виде простого двумерного data.frame или лучше tibble из tidyverse гораздо более целесообразно!

0 голосов
/ 10 июня 2018

Мне не удалось найти существующую функцию для этого.Но после использования dput для просмотра результата reshape2::melt(Titanic) мы можем использовать его части и подать правильные кусочки в reshape2::acast, чтобы «расплавить» таблицу:

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