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
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
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