Konwertuj dane z długiego formatu na szeroki format z wieloma kolumnami miar
Mam problem z określeniem najbardziej eleganckiego i elastycznego sposobu przełączania danych z formatu długiego na szeroki format, gdy chcę mieć więcej niż jedną zmienną miary.
Na przykład, oto prosta ramka danych w długim formacie.ID
jest tematemTIME
jest zmienną czasu iX
iY
są pomiary wykonaneID
wTIME
:
> my.df <- data.frame(ID=rep(c("A","B","C"), 5), TIME=rep(1:5, each=3), X=1:15, Y=16:30)
> my.df
ID TIME X Y
1 A 1 1 16
2 B 1 2 17
3 C 1 3 18
4 A 2 4 19
5 B 2 5 20
6 C 2 6 21
7 A 3 7 22
8 B 3 8 23
9 C 3 9 24
10 A 4 10 25
11 B 4 11 26
12 C 4 12 27
13 A 5 13 28
14 B 5 14 29
15 C 5 15 30
Gdybym tylko chciał zmienić wartościTIME
do nagłówków kolumn zawierających ten nagłówekX
, Wiem, że mogę użyćcast()
zreshape
pakiet (lubdcast()
zreshape2
):
> cast(my.df, ID ~ TIME, value="X")
ID 1 2 3 4 5
1 A 1 4 7 10 13
2 B 2 5 8 11 14
3 C 3 6 9 12 15
Ale to, co naprawdę chcę zrobić, to przynieść ze sobąY
jako inna zmienna miary, a nazwy kolumn odzwierciedlają zarówno nazwę zmiennej miary, jak i wartość czasu:
ID X_1 X_2 X_3 X_4 X_5 Y_1 Y_2 Y_3 Y_4 Y_5
1 A 1 4 7 10 13 16 19 22 25 28
2 B 2 5 8 11 14 17 20 23 26 29
3 C 3 6 9 12 15 18 21 24 27 30
(FWIW, nie obchodzi mnie to, czy wszystkieX
Po nich następujeY
lub jeśli są przeplatane jakX_1
, Y_1
, X_2
, Y_2
itp.)
Mogę się do tego zbliżyćodlew- dwukrotne łączenie długich danych i łączenie wyników, chociaż nazwy kolumn wymagają trochę pracy, a ja musiałbym je poprawić, gdybym musiał dodać trzecią lub czwartą zmienną opróczX
iY
:
merge(
cast(my.df, ID ~ TIME, value="X"),
cast(my.df, ID ~ TIME, value="Y"),
by="ID", suffixes=c("_X","_Y")
)
Wydaje się jakaś kombinacja funkcji wreshape2
i / lubplyr
powinienem być w stanie zrobić to bardziej elegancko niż moja próba, a także lepiej obsługiwać wiele zmiennych miary. Coś jakcast(my.df, ID ~ TIME, value=c("X","Y"))
, co nie jest ważne. Ale nie byłem w stanie tego zrozumieć.