将数组转换为R中的矩阵

Converting array to matrix in R

我有一个数组,其中包含一个名为 "comp" 的项目(是,否)的两个熟练程度变量(theta0、theta1)。这需要转换为一个矩阵。有什么办法可以像底部的那样转换矩阵吗?

我的数组如下所示:

>priCPT.i6

 , , comp = Yes

 theta1
theta0       Low       Med      High
  Low  0.8377206 0.6760511 0.4576021
  Med  0.6760511 0.4576021 0.2543239
  High 0.4576021 0.2543239 0.1211734

, , comp = No

  theta1
theta0       Low       Med      High
  Low  0.1622794 0.3239489 0.5423979
  Med  0.3239489 0.5423979 0.7456761
  High 0.5423979 0.7456761 0.8788266

attr(,"class")
[1] "CPA"   "array"

抱歉,我无法制作出您可以玩的东西。我正在寻找类似的东西:

theta0   theta1   Yes        No
Low      Low      0.8377206  0.1622794
Low      Med      ..         ..
Low      High     ..         ..
Med      Low      ..         ..
Med      Med      ..         ..
Med      High     ..         ..
High     Low      ..         ..
High     Med      ..         ..
High     High     ..         ..

此致...

您可以通过在第 3 个边距上展平矩阵来轻松获得值列:

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

剩下的就是追加 "dimnames" 列:

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

现在你可以将它们合并成一个数据框(你肯定需要一个数据框而不是一个矩阵,因为 z1 的列是数字,而 z2 的列是字符)通过:

data.frame(z2, z1)

可重现的例子

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

另一种使用 reshape2 的方法是

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