Jak zmieniać dane między szerokimi i długimi formatami w R? [Zamknięte]

32

Możesz mieć dane w formacie szerokim lub długim. Jest to dość ważna rzecz, ponieważ możliwe do zastosowania metody różnią się w zależności od formatu. Wiem, że musisz pracować z pakietem przekształcania melt()i cast()z niego, ale wydaje się, że niektóre rzeczy nie dostaję.

Czy ktoś może dać mi krótki przegląd tego, jak to robisz?

Mina
źródło
Podaj przykład tego, co chcesz osiągnąć. Czego dokładnie nie dostajesz?
mpiktas
3
Oto mój post na blogu z przykładem użycia melti cast. Tam konwersja z formatu szerokiego na długi odbywa się na jednym etapie. Naprawdę nie ma nic bardziej wyjątkowego.
mpiktas
Witamy w statystykach. Może się okazać, że pomocne jest włączenie do pytania małego, powtarzalnego zestawu danych, aby wyjaśnić, czego chcesz. Przeczytaj więcej na sigmafield.org/2011/01/18/ ...
PaulHurleyuk
Zobacz to SO na wiele sposobów, aby to zrobić.
Axeman,

Odpowiedzi:

26

Na stronie internetowej Hadleya Wickhama znajduje się kilka zasobów (obecnie nazywanych reshape2), w tym link do artykułu na temat pakietu w Journal of Statistics Software.

Oto krótki przykład z pracy:

> 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

Zauważamy, że dane są w szerokiej formie. Aby przejść do długiej formy, stopiamysmiths ramkę danych :

> 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

Zauważ, jak melt()wybraliśmy jedną ze zmiennych jako id, ale możemy jednoznacznie określić, których użyć za pomocą argumentu '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

Oto kolejny przykład ?cast:

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

Jeśli przechowujemy stopioną ramkę danych, możemy rzutować na inne formy. W nowej wersji reshape(wywoływanej reshape2) są funkcje acast()i dcast()zwracające odpowiednio wynik tablicowy (tablica, macierz, wektor) lub ramkę danych. Funkcje te przyjmują również funkcję agregującą (np. mean()) W celu zapewnienia podsumowań danych w postaci stopionej. Na przykład, w oparciu o powyższy przykład jakości powietrza, możemy generować, w szerokiej formie, średnie miesięczne wartości dla zmiennych w zbiorze danych:

> 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

Istnieje naprawdę tylko dwie główne funkcje reshape2: melt()a acast()i dcast()parowanie. Spójrz na przykłady na stronach pomocy dla tych dwóch funkcji, zobacz stronę internetową Hadleya (link powyżej) i spójrz na artykuł, o którym wspomniałem. To powinno ci na początek wystarczyć.

Możesz także zajrzeć do plyrpakietu Hadleya, który robi podobne rzeczy, reshape2ale został zaprojektowany, aby zrobić o wiele więcej.

Przywróć Monikę - G. Simpson
źródło
dcast(aqm, month ~ variable), co by to zrobił bez funkcji agregującej?
qed
@CravingSpirit zwróci liczbę obserwacji dla każdej zmiennej. Przeczytaj, ?dcastco by ci to powiedział (zobacz szczegóły argumentu fun.aggregate).
Przywróć Monikę - G. Simpson
8
  • Quick-R ma prosty przykład użycia pakietu zmiany kształtu

  • Zobacz także ?reshape( LINK ), w jaki sposób można przechodzić między formatem szerokim a długim.

Jeromy Anglim
źródło
7

Nie musisz używać melti cast.

Przekształcanie danych można wykonać na wiele sposobów. W twoim konkretnym przykładzie użycie cytowania za pomocą recastz aggregatebyło zbędne, ponieważ aggregatesamo zadanie działa dobrze.

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)

Podoba mi się, jak w swoim blogu wyjaśniasz, co meltsię dzieje. Bardzo niewiele osób to rozumie, a kiedy to zobaczysz, łatwiej będzie zobaczyć, jak castdziała i jak możesz pisać własne funkcje, jeśli chcesz.

Jan
źródło
2

Zobacz wiki reshape2 . Zapewnia z pewnością więcej przykładów, jak można się spodziewać.

Stéphane Laurent
źródło
2

Zauważyłem, że nie ma tu odniesienia do bardziej wydajnych i rozbudowanych metod przekształcania data.table, dlatego bez dalszego komentarza zamieszczam doskonałą odpowiedź Zach / Arun na StackOverflow na podobne pytanie:

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

W szczególności na stronie data.tableGitHub znajduje się wspaniała winieta :

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

MichaelChirico
źródło