Как изменить данные между широким и длинным форматами в R? [закрыто]


32

Вы можете иметь данные в широком формате или в длинном формате. Это довольно важная вещь, так как используемые методы различаются в зависимости от формата. Я знаю, что вы должны работать melt()иcast() пакетом измененных форм из него, но есть некоторые вещи, которые я не понимаю.

Может кто-нибудь дать мне краткий обзор, как вы это делаете?


Пожалуйста, приведите пример того, чего вы хотите достичь. Что именно вы не получите?
mpiktas

3
Вот мой блог с примером использования meltи cast. Там преобразование из широкоформатного формата в длинный выполняется за один этап. Там действительно нет ничего более особенного.
mpiktas

Добро пожаловать в статистику. Возможно, вам будет полезно включить в свой вопрос небольшой воспроизводимый набор данных, чтобы объяснить, чего вы хотите. Читайте sigmafield.org/2011/01/18/… для получения дополнительной информации.
PaulHurleyuk

Посмотрите этот вопрос так много способов сделать это.
Axeman

Ответы:


26

На веб-сайте Хэдли Уикхэма есть несколько ресурсов для пакета (в настоящее время называется reshape2), включая ссылку на статью о пакете в журнале статистического программного обеспечения.

Вот краткий пример из бумаги:

> require(reshape2)
Loading required package: reshape2
> data(smiths)
> smiths
     subject time age weight height
1 John Smith    1  33     90   1.87
2 Mary Smith    1  NA     NA   1.54

Отметим, что данные в широкой форме. Чтобы перейти к длинной форме, мы сделаем smithsкадр данных расплавленным :

> melt(smiths)
Using subject as id variables
     subject variable value
1 John Smith     time  1.00
2 Mary Smith     time  1.00
3 John Smith      age 33.00
4 Mary Smith      age    NA
5 John Smith   weight 90.00
6 Mary Smith   weight    NA
7 John Smith   height  1.87
8 Mary Smith   height  1.54

Обратите внимание, как melt()в качестве идентификатора выбрана одна из переменных, но мы можем явно указать, какой использовать через аргумент 'id':

> melt(smiths, id = "subject")
     subject variable value
1 John Smith     time  1.00
2 Mary Smith     time  1.00
3 John Smith      age 33.00
4 Mary Smith      age    NA
5 John Smith   weight 90.00
6 Mary Smith   weight    NA
7 John Smith   height  1.87
8 Mary Smith   height  1.54

Вот еще один пример из ?cast:

#Air quality example
names(airquality) <- tolower(names(airquality))
aqm <- melt(airquality, id=c("month", "day"), na.rm=TRUE)

Если мы храним расплавленный фрейм данных, мы можем привести его в другие формы. В новой версии reshape(называется reshape2) есть функции acast()и dcast()возвращая массив типа (массив, матрица, вектор) результат или кадр данных , соответственно. Эти функции также выполняют функцию агрегирования (например mean()) для предоставления сводных данных в расплавленном виде. Например, следуя приведенному выше примеру качества воздуха, мы можем в широком формате сгенерировать среднемесячные значения для переменных в наборе данных:

> dcast(aqm, month ~ variable, mean)
  month    ozone  solar.r      wind     temp
1     5 23.61538 181.2963 11.622581 65.54839
2     6 29.44444 190.1667 10.266667 79.10000
3     7 59.11538 216.4839  8.941935 83.90323
4     8 59.96154 171.8571  8.793548 83.96774
5     9 31.44828 167.4333 10.180000 76.90000

На самом деле есть только две основные функции reshape2: melt()and acast()и dcast()сопряжение. Посмотрите примеры на страницах справки для этих двух функций, посетите веб-сайт Хэдли (ссылка выше) и посмотрите на статью, которую я упомянул. Это должно начать вас.

Вы могли бы также взглянуть на plyrпакет Хэдли, который делает подобные вещи, reshape2но разработан, чтобы сделать намного больше помимо этого.


dcast(aqm, month ~ variable)Что бы это сделать без агрегирующей функции?
ч.т.д.

@CravingSpirit возвращает число наблюдений для каждой переменной. Прочитайте, ?dcastчто сказал бы вам это (см. Подробности для аргумента fun.aggregate).
Восстановить Монику - Дж. Симпсон


7

Вам не нужно использовать meltи cast.

Изменение формы данных может быть сделано многими способами. В вашем конкретном примере на вашем сайте использование recastс aggregateбыло избыточно, потому aggregateчто задача справляется все самостоятельно.

aggregate(cbind(LPMVTUZ, LPMVTVC, LPMVTXC) ~ year, dtm, sum)
# or even briefer by first removing the columns you don't want to use
aggregate(. ~ year, dtm[,-2], sum)

Мне нравится, как в своем блоге вы объясняете, что meltделаете. Мало кто понимает это, и как только вы это видите, становится легче увидеть, как castработает и как вы можете написать свои собственные функции, если хотите.



2

Просто заметив, что здесь нет ссылок на более эффективные и обширные методы изменения формы data.table, поэтому я без дальнейших комментариев отправляю превосходный ответ Зака ​​/ Аруна на StackOverflow для аналогичного вопроса:

https://stackoverflow.com/questions/6902087/proper-fastest-way-to-reshape-a-data-table/6913151#6913151

И, в частности, на data.tableстранице GitHub есть замечательная виньетка :

https://github.com/Rdatatable/data.table/wiki/Getting-started

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.