使用两个重复测量将长格式转换为宽格式

11

我知道“长转宽”这个问题已经在这里被问了很多次,但我遇到了一种情况,其中我有两个值变量是重复测量的。

          id sex  time      score1    score2
1  subject 1   m Time1 -0.20926263 0.2499310
2  subject 2   m Time1  0.17147511 3.2708905
3  subject 3   m Time1 -0.82619584 0.5993917
4  subject 4   f Time1 -0.95568823 4.4729726
5  subject 5   f Time1 -2.29939525 8.0101254
6  subject 1   m Time2 -0.37914702 3.6387589
7  subject 2   m Time2  0.26759909 4.9027533
8  subject 3   m Time2  0.07727621 2.1848642
9  subject 4   f Time2 -0.08613439 5.8747074
10 subject 5   f Time2 -0.02743044 4.3963938
11 subject 1   m Time3  0.07176053 3.7959496
12 subject 2   m Time3  0.46463917 5.2494579
13 subject 3   m Time3 -0.68764512 2.2639503
14 subject 4   f Time3 -0.56670061 2.3361909
15 subject 5   f Time3  1.70731774 5.8345116

快速复制数据框(DF)的方法。

DF<-data.frame(id=rep(paste("subject", 1:5, sep=" "), 3),              
               sex=rep(c("m","m","m","f","f"), 3),                     
               time=c(rep("Time1",5), rep("Time2",5), rep("Time3",5)), 
               score1=rnorm(15), score2=abs(rnorm(15)*4))              

我可以使用基础函数中的reshape函数解决两个重复测量变量的长到宽问题,但我希望得到plyrreshape2/1的答案,因为这些包对我来说通常更加直观。如果你有其他解决方案,请提供,因为学习的过程是很棒的。

基础函数的解决方案:

wide <- reshape(DF, v.names=c("score1", "score2"), idvar="id",         
                timevar="time", direction="wide")                      
wide   

1
我不明白为什么会有“离题”投票关闭这个问题... - Ben Bolker
1
Ben用reshape做得很好,而且代码很短。我非常乐意尝试其他方法(不确定如何使用data.table等) 。 - Tyler Rinker
2个回答

12

我认为这样做就可以了:

library(reshape)
m <- melt(DF)

最简单的方法,但时间和得分的顺序与您的示例相反(如果这很重要)

cast(m,id+sex~...)

更明确地说:

cast(m,id+sex~variable+time)
你可以将这个缩减为一行代码:
recast(DF,id+sex~...)

如果你愿意,可以使用新的reshape2包替换reshape,将cast替换为dcast(在reshape2中包含的版本的recast无法获得所需的结果。)


2

考虑到这个问题的提出时间,Ben的回答很好。然而需要注意的是,“data.table”中更近期版本包含的dcast函数可以处理这样的问题,而不必首先melt数据。因此,使用它将是一种更有效的方法。

library(data.table)
dcast(as.data.table(DF), id + sex ~ time, value.var = c("score1", "score2"))
##           id sex score1_Time1 score1_Time2 score1_Time3 score2_Time1 score2_Time2 score2_Time3
## 1: subject 1   m   0.78213630   -0.1557955  -0.10278773    1.5771598     1.013447    1.4583278
## 2: subject 2   m   0.07456498   -1.4707524   0.38767161    0.2372536     2.787854    3.0741317
## 3: subject 3   m  -1.98935170   -0.4781501  -0.05380504    4.4001015     2.226653    0.4493848
## 4: subject 4   f   0.61982575    0.4179416  -1.37705956    3.0527030     2.755023    3.5244309
## 5: subject 5   f  -0.05612874    1.3586796  -0.41499456    0.6580944     2.829981    1.5924235

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接