我在尝试将数据从长格式转换为宽格式时遇到了困难,特别是当我有多个要导入的度量变量时,最优雅和灵活的方法是什么,我还不确定。
例如,下面是一个简单的长格式数据框。其中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
的值转换为包含X
的列标题,我知道可以使用来自reshape
包(或reshape2
中的dcast()
)的cast()
:
> 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
顺便一提,我并不在乎所有的X
是先出现还是后跟着Y
,或者它们是交替出现的,比如X_1
,Y_1
,X_2
,Y_2
等。
通过两次将长数据转换(cast)并合并结果,我可以接近实现这一点,尽管需要调整列名,并且如果需要添加第三个或第四个变量,除了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"))
这样的操作,但它不是有效的。但我还没有找到解决方法。