Mam problem z przekształceniem mojego data.frame
szerokiego stołu w długi. W tej chwili wygląda to tak:
Code Country 1950 1951 1952 1953 1954
AFG Afghanistan 20,249 21,352 22,532 23,557 24,555
ALB Albania 8,097 8,986 10,058 11,123 12,246
Teraz chciałbym przekształcić to data.frame
w długi data.frame
. Coś takiego:
Code Country Year Value
AFG Afghanistan 1950 20,249
AFG Afghanistan 1951 21,352
AFG Afghanistan 1952 22,532
AFG Afghanistan 1953 23,557
AFG Afghanistan 1954 24,555
ALB Albania 1950 8,097
ALB Albania 1951 8,986
ALB Albania 1952 10,058
ALB Albania 1953 11,123
ALB Albania 1954 12,246
Przyjrzałem się i już próbowałem używać funkcji melt()
i, reshape()
jak sugerowali niektórzy w podobnych pytaniach. Jednak jak dotąd otrzymuję tylko niechlujne wyniki.
Jeśli to możliwe, chciałbym to zrobić za pomocą reshape()
funkcji, ponieważ wygląda to trochę przyjemniej w obsłudze.
Odpowiedzi:
reshape()
zajmuje trochę czasu, aby się przyzwyczaić, tak jakmelt
/cast
. Oto rozwiązanie ze zmianą kształtu, zakładając, że ramka danych nazywa sięd
:źródło
Trzy alternatywne rozwiązania:
1) z Tabela danych:
Możesz użyć tej samej
melt
funkcji, co wreshape2
pakiecie (która jest rozszerzoną i ulepszoną implementacją).melt
fromdata.table
ma również więcej parametrów niżmelt
funkcja zreshape2
. Możesz na przykład określić również nazwę kolumny-zmiennej:co daje:
Kilka alternatywnych notacji:
2) Z tidyr:
Kilka alternatywnych notacji:
3) Z reshape2:
Kilka alternatywnych notacji, które dają ten sam wynik:
UWAGI:
NA
wartości, możesz dodaćna.rm = TRUE
do funkcji,melt
a takżegather
.Innym problemem związanym z danymi jest to, że wartości będą odczytywane przez R jako wartości znakowe (jako wynik
,
w liczbach). Możesz to naprawić za pomocągsub
ias.numeric
:Lub bezpośrednio za pomocą
data.table
lubdplyr
:Dane:
źródło
id
iwtime
ramce danych,melt
nie możesz powiedzieć, co chcesz zrobić w tym przypadku.id.vars
imeasure.vars
.id.vars
imeasure.vars
można to określić w pierwszej możliwości, przepraszam za bałagan, to moja wina.-c(var1, var2)
...-c(var1, var2)
, pomija te zmienne podczas przekształcania danych z formatu szerokiego do długiego.Korzystanie z pakietu zmiany kształtu :
źródło
Z
tidyr_1.0.0
, innym rozwiązaniem jestpivot_longer
dane
źródło
gather
jest wycofywany ipivot_longer
jest teraz właściwym sposobem, aby to osiągnąć.Ponieważ ta odpowiedź jest oznaczona tagiem r-faq, To uważa, że byłoby przydatne, aby dzielić inną alternatywę od podstawy R:
stack
.Pamiętaj jednak, że
stack
to nie działa zfactor
s - działa tylko wtedy , gdyis.vector
jestTRUE
, a z dokumentacji dlais.vector
dowiadujemy się, że:Używam przykładowych danych z odpowiedzi @ Jaap , gdzie wartości w kolumnach roku to
factor
s.Oto
stack
podejście:źródło
Oto kolejny przykład pokazujący użycie
gather
fromtidyr
. Możesz wybrać kolumny dogather
, usuwając je pojedynczo (tak jak ja tutaj) lub dołączając jawnie lata, które chcesz.Zwróć uwagę, że aby obsłużyć przecinki (i znaki X dodane, jeśli
check.names = FALSE
nie są ustawione), używam również funkcjidplyr
mutate zparse_number
z,readr
aby przekonwertować wartości tekstowe z powrotem na liczby. Są to wszystkie elementytidyverse
i można je ładować razem zlibrary(tidyverse)
Zwroty:
źródło
Tutaj jest sqldf rozwiązanie:
Aby wykonać zapytanie bez wpisywania wszystkiego, możesz użyć następujących poleceń:
Podziękowania dla G. Grothendiecka za jego wdrożenie.
Niestety nie sądzę
PIVOT
iUNPIVOT
mógłbym pracowaćR
SQLite
. Jeśli chcesz napisać zapytanie w bardziej wyrafinowany sposób, możesz również zapoznać się z tymi postami:Używanie
sprintf
pisania zapytań sql lub przekazywanie zmiennych dosqldf
źródło
Możesz również użyć
cdata
pakietu, który wykorzystuje koncepcję (transformacji) tabeli sterującej:Obecnie badam ten pakiet i uważam, że jest całkiem dostępny. Jest przeznaczony do znacznie bardziej skomplikowanych przekształceń i obejmuje transformację wsteczną. Dostępny jest tutorial .
źródło