对不起"这种矩阵格式"我的问题非常模糊(建议改善我的问题?)。我有一个像这样的矩阵
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
是否有一个可以轻松转换数据帧的函数?
由于
答案 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)
使用dplyr
和tidyr
,您可以执行以下操作:
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