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

时间:2016-08-09 16:36:28

标签: r matrix dataframe transformation

对不起"这种矩阵格式"我的问题非常模糊(建议改善我的问题?)。我有一个像这样的矩阵

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

是否有一个可以轻松转换数据帧的函数?

由于

3 个答案:

答案 0 :(得分:3)

您可以使用melt包中的reshape2

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

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

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

问题是你有一个&#34;宽的&#34;格式,你想将其转换为&#34; long&#34;。 melt通常适用于这些情况。

答案 1 :(得分:1)

使用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

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

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

答案 2 :(得分:1)

一种基本解决方案,可以让您轻松地根据需要重新设计,使用stack。 data.frame函数将通过R&amp; recyclng规则为你做&#34; rep() -

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

这会将factor 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