Аккуратные данные Расплав и литье

В Tidy Data pdf Уикхема есть пример перехода от грязного к аккуратные данные.

Интересно, где код?

Например, какой код используется для перехода от

Таблица 1: Типичный набор данных презентации.

to

Таблица 3: Те же данные, что и в таблице 1, но с переменными в столбцах и наблюдениями в строках.

Возможно, расплавить или отлить. Но из http://www.statmethods.net/management/reshape.html я не могу Смотри как.

(Примечание для себя: нужно для ВВП на душу населения...)


person Jacob Lindberg    schedule 08.07.2015    source источник
comment
Мне кажется, что таблица 1 — это матрица, поэтому вы можете просто использовать libray(reshape2); melt(table1) (если ваш набор данных называется table1).   -  person A5C1D2H2I1M1N2O1R2T1    schedule 08.07.2015
comment
@Molx, это не самое интуитивно понятное место для поиска (или самое интуитивно понятное поисковое выражение), поскольку это разные пакеты (хотя один из них содержит множество оболочек для подходов reshape2). Виньетка tidyr фокусируется только на data.frames, в то время как пакет reshape2 обрабатывает и другие типы данных.   -  person A5C1D2H2I1M1N2O1R2T1    schedule 08.07.2015
comment
@AnandaMahto Вы правы, я действительно думал, что статья посвящена тидыру, учитывая ее название, и не заметил, что речь идет о reshape2.   -  person Molx    schedule 08.07.2015
comment
Бумага старше тидыра на несколько лет. Я бы по-прежнему рекомендовал ОП взглянуть на вингетту tidyr, он охватывает многие из тех же принципов, показывая сопровождающий tidyr код.   -  person Gregor Thomas    schedule 08.07.2015
comment
@Грегор, но по-прежнему важно понимать, что tidyr делает меньше, чем reshape2, и более ограничен в типах данных, которые он принимает в качестве входных данных.   -  person A5C1D2H2I1M1N2O1R2T1    schedule 08.07.2015


Ответы (1)


Ответ зависит от того, какова структура ваших данных. В статье, на которую вы ссылаетесь, Хэдли писал о пакетах «reshape» и «reshape2».

Неясно, какая структура данных в «Таблице 1». Судя по описанию, это будет звучать как matrix с именованными dimnames (как я показываю в mymat). В этом случае сработает простой melt:

library(reshape2)
melt(mymat)
#           Var1       Var2 value
# 1   John Smith treatmenta     —
# 2     Jane Doe treatmenta    16
# 3 Mary Johnson treatmenta     3
# 4   John Smith treatmentb     2
# 5     Jane Doe treatmentb    11
# 6 Mary Johnson treatmentb     1

Если бы это была не матрица, а data.frame с row.names, вы все равно можете использовать matrix метод, используя что-то вроде melt(as.matrix(mymat)).

Если, с другой стороны, "имена" являются столбцом в data.frame (как в виньетке "тидыр", вам нужно указать либо id.vars, либо measure.vars, чтобы melt знал, как обращаться со столбцами.

melt(mydf, id.vars = "name")
#           name   variable value
# 1   John Smith treatmenta     —
# 2     Jane Doe treatmenta    16
# 3 Mary Johnson treatmenta     3
# 4   John Smith treatmentb     2
# 5     Jane Doe treatmentb    11
# 6 Mary Johnson treatmentb     1

Новичок в блоке - "тидыр". Пакет "tidyr" работает с data.frames, потому что он часто используется вместе с dplyr. Я не буду воспроизводить здесь код для "tidyr", потому что он достаточно освещен в виньетка.


Образец данных:

mymat <- structure(c("—", "16", "3", " 2", "11", " 1"), .Dim = c(3L, 
    2L), .Dimnames = list(c("John Smith", "Jane Doe", "Mary Johnson"
    ), c("treatmenta", "treatmentb")))

mydf <- structure(list(name = structure(c(2L, 1L, 3L), .Label = c("Jane Doe", 
    "John Smith", "Mary Johnson"), class = "factor"), treatmenta = c("—", 
    "16", "3"), treatmentb = c(2L, 11L, 1L)), .Names = c("name", 
    "treatmenta", "treatmentb"), row.names = c(NA, 3L), class = "data.frame")
person A5C1D2H2I1M1N2O1R2T1    schedule 08.07.2015