2017-06-01 52 views
0

我搜索到了构造我的数据,但我没有成功。对不起,如果我在搜索时遗漏了一些东西在矩阵中构造多个数据

这里是我的数据

id M1 M2 M3 Q1 Q2 Q3 
1 12 13 14 A B C 
2 13 10 15 D D E 
3 16 2 16 C B A 
4 19 11 11 D A C 
5 9 0 10 B A D 

我想看到它,如下所示:

ID M Q V 
1 M1 A 12 
1 M2 B 13 
1 M3 C 14 
2 M1 D 13 
2 M2 D 10 
2 M3 E 15 
3 M1 C 16 
3 M2 B 2 
3 M3 A 16 
4 M1 D 19 
4 M2 A 11 
4 M3 C 11 
5 M1 B 9 
5 M2 A 0 
5 M3 D 10 

有一个简单的方法呢?感谢您的帮助

回答

0

以下是一种使用reshape2库的方法,它可能适合您。首先,对每个变量子集(“M”和“Q”)进行一次数据融合。将它们绑定到单个数据框中,然后重新排序它们。

M<-melt(mat, id.vars = "id", 
     measure.vars = c("M1","M2","M3"), 
     variable.name = "M", value.name = "V",) 

Q<- melt(mat, id.vars = "id", 
     measure.vars = c("Q1", "Q2", "Q3"), 
     value.name = "Q")[,3] 

bound<- cbind(M, Q) 
final <- bound[order(bound$id),][,c(1,2,4,3)] 

> final 
    id M Q V 
1 1 M1 A 12 
6 1 M2 B 13 
11 1 M3 C 14 
2 2 M1 D 13 
7 2 M2 D 10 
12 2 M3 E 15 
3 3 M1 C 16 
8 3 M2 B 2 
13 3 M3 A 16 
4 4 M1 D 19 
9 4 M2 A 11 
14 4 M3 C 11 
5 5 M1 B 9 
10 5 M2 A 0 
15 5 M3 D 10 
+0

你打赌。这真的只是跳过一步。如果你运行不带'[,3]'的代码,你会看到代码'Q < - melt(......“Q”)'返回一个有三列的数据帧。通过使用'[,3]'来对该数据帧进行子集化,只保留第三列(具有“A,B,C,D,E”值的那一列)。 –

+0

你不应该。你*会*需要改变你的测量变量代码,比如'... measure.vars = c(“Q1”,“Q2”,“Q3”,“Q4”,“Q5”,“Q6”)。 ,...'(和M值相同)。然而,因为'熔化'将把所有这些放到一个列中,所以只要没有其他变化,就可以离开'[,3]'。如果您查看'print(M)',您应该明白我的意思 - 有三列,但只有一列(在这种情况下为第2列)包含M值。 –

+0

非常感谢您的帮助 – green2000