用多个度量列将数据从长格式转换为宽格式当我想带来多个度量变量时,我很难找到最优雅和最灵活的方法将数据从长格式切换到宽格式。例如,这里有一个长格式的简单数据框架。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 Y1 A 1 1 162 B 1 2 173 C 1 3 184 A 2 4 195 B 2 5 206 C 2 6 217
A 3 7 228 B 3 8 239 C 3 9 2410 A 4 10 2511 B 4 11 2612 C 4 12 2713 A 5 13 2814
B 5 14 2915 C 5 15 30如果我只想把TIME的列标题中包含X,我知道我可以用cast()从reshape包装(或dcast()从…reshape2):> cast(my.df, ID ~ TIME, value="X")
ID 1 2 3 4 51 A 1 4 7 10 132 B 2 5 8 11 143 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_51 A 1 4 7 10 13 16 19 22 25 282 B 2 5 8 11 14 17
20 23 26 293 C 3 6 9 12 15 18 21 24 27 30(FWIW,我真的不在乎X的后面是Y或者如果它们交织在一起X_1, Y_1, X_2, Y_2等等)我可以通过铸造-两次对长数据进行合并结果,尽管列名需要一些工作,如果需要添加第3或第4个变量,则需要对其进行调整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")),这是无效的。但我还没弄明白。
3 回答
不负相思意
TA贡献1777条经验 获得超10个赞
reshape(my.df,
idvar = "ID",
timevar = "TIME",
direction = "wide")
施予
ID X.1 Y.1 X.2 Y.2 X.3 Y.3 X.4 Y.4 X.5 Y.5
1 A 1 16 4 19 7 22 10 25 13 28
2 B 2 17 5 20 8 23 11 26 14 29
3 C 3 18 6 21 9 24 12 27 15 30
慕容708150
TA贡献1831条经验 获得超4个赞
data.table_1.9.5
melt
value.var
here
library(data.table)
dcast(setDT(my.df), ID~TIME, value.var=c('X', 'Y'))
# ID 1_X 2_X 3_X 4_X 5_X 1_Y 2_Y 3_Y 4_Y 5_Y
#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
- 3 回答
- 0 关注
- 540 浏览
添加回答
举报
0/150
提交
取消