Як змінити дані між широкими та довгими форматами в R? [зачинено]


32

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

Чи може хтось дати мені короткий огляд, як ви це робите?


Наведіть приклад того, чого ви хочете досягти. Чого саме ви не отримуєте?
mpiktas

3
Ось моя публікація в блозі з прикладом використання meltта cast. Там конверсія з широкого в довгий формат проводиться на одному етапі. Насправді немає нічого більш особливого.
mpiktas

Ласкаво просимо до статистики. Ви можете виявити, що це допомагає включити у своє запитання невеликий відтворюваний набір даних, щоб пояснити, що ви хочете. Детальніше читайте на sigmafield.org/2011/01/18/… .
Павло Хурлейюк

Дивіться у цьому питанні питання щодо багатьох способів зробити це.
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()і acast()таdcast() спаровування. Подивіться приклади на довідкових сторінках для цих двох функцій, перегляньте веб-сайт Хедлі (посилання вище) та подивіться на згаданий нами документ. Це і повинно вас почати.

You might also look into Hadley's plyr package which does similar things to reshape2 but is designed to do a whole lot more besides.


dcast(aqm, month ~ variable), what would this do without the aggregating function?
qed

@CravingSpirit it would return the number of observations for each variable. Read ?dcast which would have told you this (see the details for argument fun.aggregate).
Reinstate Monica - G. Simpson


7

You don't have to use melt and cast.

Reshaping data can be done lots of ways. In your particular example on your cite using recast with aggregate was redundant because aggregate does the task fine all on it's own.

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)

I do like how, in your blog post, you explain what melt is doing. Very few people understand that and once you see it then it gets easier to see how cast works and how you might write your own functions if you want.



2

Just noticing there's no reference to the more efficient and extensive reshaping methods in data.table here, so I am posting without further comment the excellent answer by Zach/Arun on StackOverflow for a similar question:

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

And in particular there's the wonderful vignette on the data.table GitHub page:

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

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.