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 wszystkieXPo nich następujeYlub jeśli są przeplatane jakX_1, Y_1, X_2, Y_2itp.)

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ć.

questionAnswers(4)

yourAnswerToTheQuestion