Converting array to matrix in R

后端 未结 2 967
感情败类
感情败类 2021-01-12 12:52

I have an array, including two proficiency variables (theta0, theta1) over an item (Yes, No) called \"comp\". This needs to be converted to one matrix. Is there any way that

相关标签:
2条回答
  • 2021-01-12 13:31

    You can easily get columns of values by flattening the matrix on the 3rd margin:

    z1 <- apply(priCPT.i6, 3L, c)
    ## we can also simply use `matrix`; but remember to set `dimnames`
    ## otherwise we lose dimnames
    ## z1 <- matrix(priCPT.i6, ncol = 2L,
    ##              dimnames = list(NULL, dimnames(priCPT.i6)[[3]]))
    

    What you need for the rest is to append the "dimnames" columns:

    z2 <- expand.grid(dimnames(priCPT.i6)[1:2])
    

    Now you can merge them into a data frame (you definitely need a data frame than a matrix, because columns of z1 are numeric while columns of z2 are character) via:

    data.frame(z2, z1)
    

    Reproducible example

    x <- array(1:18, dim = c(3L, 3L, 2L), dimnames = list(
               c("Low", "Medium", "High"), c("Low", "Medium", "High"), c("Yes", "No")))
    
    #, , Yes
    #
    #       Low Medium High
    #Low      1      4    7
    #Medium   2      5    8
    #High     3      6    9
    #
    #, , No
    #
    #       Low Medium High
    #Low     10     13   16
    #Medium  11     14   17
    #High    12     15   18
    
    z1 <- apply(x, 3L, c)
    ## z1 <- matrix(x, ncol = 2L, dimnames = list(NULL, dimnames(x)[[3]]))
    z2 <- expand.grid(dimnames(x)[1:2])
    data.frame(z2, z1)
    
    #    Var1   Var2 Yes No
    #1    Low    Low   1 10
    #2 Medium    Low   2 11
    #3   High    Low   3 12
    #4    Low Medium   4 13
    #5 Medium Medium   5 14
    #6   High Medium   6 15
    #7    Low   High   7 16
    #8 Medium   High   8 17
    #9   High   High   9 18
    
    0 讨论(0)
  • 2021-01-12 13:46

    An alternative using reshape2 would be

    x <- array(1:18, dim = c(3L, 3L, 2L), dimnames = list(
               c("Low", "Medium", "High"), 
               c("Low", "Medium", "High"), 
               c("Yes", "No")))
    
    library(reshape2)
    df <- dcast(melt(x), Var1+Var2~Var3) 
    df
    
         Var1   Var2 Yes No
    1    Low    Low   1 10
    2    Low Medium   4 13
    3    Low   High   7 16
    4 Medium    Low   2 11
    5 Medium Medium   5 14
    6 Medium   High   8 17
    7   High    Low   3 12
    8   High Medium   6 15
    9   High   High   9 18
    
    0 讨论(0)
提交回复
热议问题