当我想要携带多个度量变量时,我无法找出将数据从长格式转换为宽格式的最优雅和灵活的方法。
例如,这是一个长格式的简单数据框。 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
,我知道我可以cast()
从reshape
包(或dcast()
from 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
's 都先跟在Y
's 之后,或者它们是否交错为X_1
, Y_1
, X_2
,Y_2
等)
我可以通过对长数据进行两次转换并合并结果来接近这一点,尽管列名需要一些工作,如果我需要在X
and之外添加第三个或第四个变量,我需要对其进行调整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"))
,这是无效的。但我一直无法弄清楚。