如何将此矩阵格式转换为矩阵以在 R 中进行重复测量分析?

How do I transform this matrix format to a matrix for repeated measures analysis in R?

抱歉 "this matrix format" 在我的问题中非常模糊(改进我的问题的建议?)。我有一个像这样的矩阵

x <- data.frame(ID = c('A','B','C','D'), SCORE_YR1 = c(2,2,1,0), 
        SCORE_YR2 = c(2,3,3,1), SCORE_YR3 = c(0,2,2,5))

x
  ID SCORE_YR1 SCORE_YR2 SCORE_YR3
1  A         2         2         0
2  B         2         3         2
3  C         1         3         2
4  D         0         1         5

我想将矩阵格式转换成这样

y <- data.frame(ID = rep(c('A','B','C','D'),3), YEAR = rep(1:3,each=4), 
        SCORE = c(x$SCORE_YR1,x$SCORE_YR2,x$SCORE_YR3))

y
   ID YEAR SCORE
1   A    1     2
2   B    1     2
3   C    1     1
4   D    1     0
5   A    2     2
6   B    2     3
7   C    2     3
8   D    2     1
9   A    3     0
10  B    3     2
11  C    3     2
12  D    3     5

是否有可以像这样轻松转换数据框的函数?

谢谢

您可以使用 reshape2 包中的 melt

library(reshape2)

x <- melt(x, id.vars = "ID")

将列名更改为上面的名称:

names(x)[2:3] <- c("YEAR","SCORE")

此时数据框看起来像这样:

> x
   ID      YEAR SCORE
1   A SCORE_YR1     2
2   B SCORE_YR1     2
3   C SCORE_YR1     1
4   D SCORE_YR1     0
5   A SCORE_YR2     2
6   B SCORE_YR2     3
7   C SCORE_YR2     3
8   D SCORE_YR2     1
9   A SCORE_YR3     0
10  B SCORE_YR3     2
11  C SCORE_YR3     2
12  D SCORE_YR3     5

YEAR 列上执行 as.numeric 将其转换为数字:

x$YEAR <- as.numeric(x$YEAR)

> x
   ID YEAR SCORE
1   A    1     2
2   B    1     2
3   C    1     1
4   D    1     0
5   A    2     2
6   B    2     3
7   C    2     3
8   D    2     1
9   A    3     0
10  B    3     2
11  C    3     2
12  D    3     5

问题是您有 "wide" 格式的数据,您想要将其转换为 "long"。 melt 通常适用于这些情况。

使用 dplyrtidyr,您可以:

library(dplyr); library(tidyr)
x %>% 
      gather(YEAR, SCORE, -ID) %>% 
      mutate(YEAR = extract_numeric(YEAR))

#   ID YEAR SCORE
#1   A    1     2
#2   B    1     2
#3   C    1     1
#4   D    1     0
#5   A    2     2
#6   B    2     3
#7   C    2     3
#8   D    2     1
#9   A    3     0
#10  B    3     2
#11  C    3     2
#12  D    3     5

或使用 reshape 基础 R 中的函数:

reshape(x, varying = 2:4, sep = "_YR", dir = "long", timevar = "YEAR")[1:3]

#    ID YEAR SCORE
#1.1  A    1     2
#2.1  B    1     2
#3.1  C    1     1
#4.1  D    1     0
#1.2  A    2     2
#2.2  B    2     3
#3.2  C    2     3
#4.2  D    2     1
#1.3  A    3     0
#2.3  B    3     2
#3.3  C    3     2
#4.3  D    3     5

一个基础解决方案可以为您提供一些可以轻松修改为您需要的东西,这涉及使用 stack。 data.frame 函数将通过 R 的回收规则为您执行“rep()-ing:

y <- data.frame(x$ID, stack(x[-1]))
y
#-------------
   x.ID values       ind
1     A      2 SCORE_YR1
2     B      2 SCORE_YR1
3     C      1 SCORE_YR1
4     D      0 SCORE_YR1
5     A      2 SCORE_YR2
6     B      3 SCORE_YR2
7     C      3 SCORE_YR2
8     D      1 SCORE_YR2
9     A      0 SCORE_YR3
10    B      2 SCORE_YR3
11    C      2 SCORE_YR3
12    D      5 SCORE_YR3

这会将因子 ind 列转换为数值向量:

> y$ind <- seq_along(unique(y$ind))[y$ind]
> y
   x.ID values ind
1     A      2   1
2     B      2   1
3     C      1   1
4     D      0   1
5     A      2   2
6     B      3   2
7     C      3   2
8     D      1   2
9     A      0   3
10    B      2   3
11    C      2   3
12    D      5   3