Using melt with matrix or data.frame gives different output

前端 未结 1 485
南方客
南方客 2020-12-18 00:44

Consider the following code:

set.seed(1)
M = matrix(rnorm(9), ncol = 3)
dimnames(M) = list(LETTERS[1:3], LETTERS[1:3])

print(M)
           A          B              


        
相关标签:
1条回答
  • 2020-12-18 01:28

    The basic reason is that there are different methods for melt, which you can see by running methods("melt"). Most of these can be accessed by, say, reshape2:::melt.matrix or reshape2:::melt.data.frame, which can send you on your hunt for figuring out exactly why the results are different.

    But, to summarize what you will find, basically, melt.matrix will end up doing something like:

    cbind(expand.grid(dimnames(M)), value = as.vector(M))
    #   Var1 Var2      value
    # 1    A    A -0.6264538
    # 2    B    A  0.1836433
    # 3    C    A -0.8356286
    # 4    A    B  1.5952808
    # 5    B    B  0.3295078
    # 6    C    B -0.8204684
    # 7    A    C  0.4874291
    # 8    B    C  0.7383247
    # 9    C    C  0.5757814
    

    ... while melt.data.frame will end up doing something like this:

    N <- data.frame(M)
    data.frame(var1 = rep(names(N), each = nrow(N)), value = unlist(unname(N)))
    #   var1      value
    # 1    A -0.6264538
    # 2    A  0.1836433
    # 3    A -0.8356286
    # 4    B  1.5952808
    # 5    B  0.3295078
    # 6    B -0.8204684
    # 7    C  0.4874291
    # 8    C  0.7383247
    # 9    C  0.5757814
    

    Of course, the actual functions do a lot more error checking and are designed to let you conveniently specify which columns should be melted and so on.

    Note that the data.frame method doesn't make use of the rownames, so as mentioned in the comments, to get the same result with the data.frame method, you'll have to add them in to the melt command.

    0 讨论(0)
提交回复
热议问题