У меня возникли проблемы с выяснением наиболее элегантного и гибкого способа переключения данных с длинного формата на широкий формат, когда у меня есть более одной переменной измерения, которую я хочу взять с собой.
Например, вот простой фрейм данных в длинном формате. ID - субъект, TIME - временная переменная, а X и Y - измерения, сделанные из ID в TIME:
> 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
Если бы я просто хотел повернуть значения TIME в заголовки столбцов, содержащие include X, я знаю, что могу использовать листинг из пакета reshape (или dcast из reshape2):
> 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
Но то, что я действительно хочу сделать, также приводит к Y как другую переменную меры, и имена столбцов отражают как имя переменной меры, так и значение времени:
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, мне все равно, если сначала все X будут сопровождаться Y, или если они чередуются как X_1, Y_1, X_2, Y_2 и т.д.)
Я могу приблизиться к этому, дважды вставляя длинные данные и объединяя результаты, хотя имена столбцов требуют некоторой работы, и мне нужно будет настроить его, если мне нужно добавить третью или четвертую переменную в дополнение к X и Y:
merge(
cast(my.df, ID ~ TIME, value="X"),
cast(my.df, ID ~ TIME, value="Y"),
by="ID", suffixes=c("_X","_Y")
)
Кажется, что некоторая комбинация функций в reshape2 и/или plyr должна быть в состоянии сделать это более элегантно, что моя попытка, а также обработка нескольких переменных измерения более чисто. Что-то вроде cast (my.df, ID ~ TIME, value = c ( "X", "Y" )), что недопустимо. Но я не смог понять это.
Могут ли какие-нибудь R-мастера помочь мне? Спасибо.