【问题标题】:Structuring multiple data in a matrix在矩阵中构造多个数据
【发布时间】:2017-11-03 00:53:23
【问题描述】:

我搜索以构建我的数据,但没有成功。抱歉,如果我在搜索过程中遗漏了什么。

这是我的数据

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

有简单的方法吗?感谢您的帮助

【问题讨论】:

    标签: r reshape


    【解决方案1】:

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

    【讨论】:

    • 你打赌。这真的只是跳过了一步。如果您在没有[,3] 的情况下运行代码,您将看到代码Q&lt;- melt(... ..."Q") 返回一个包含三列的数据框。通过使用[,3] 对该数据框进行子集化,仅保留第三列(具有“A、B、C、D、E”值的那一列)。
    • 你不应该这样做。您需要将您的测量变量代码更改为 ... measure.vars = c("Q1", "Q2", "Q3", "Q4", "Q5", "Q6"), ... 之类的代码(对于 M 值也是如此)。但是,由于melt 会将所有这些都放在一个列中,因此只要没有其他任何更改,您就可以离开[,3]。如果您查看print(M),您应该明白我的意思——共有三列,但只有一列(在这种情况下为第 2 列)包含 M 个值。
    猜你喜欢
    • 2013-10-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-20
    • 1970-01-01
    相关资源
    最近更新 更多