将数组转换为矩阵在 R 中。

8

我有一个数组,包含两个熟练变量(theta0, theta1)和一个名为"comp"的项目(是,否)。这需要转换为一个矩阵。有没有办法将底部的矩阵转换成一个矩阵?

我的数组长这样:

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

Regards...


tidyr::spread(as.data.frame.table(priCPT.i6), Var3, Freq) - alistaire
2个回答

11

您可以通过在第三个边界上展开矩阵来轻松获取值的列:

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

1
感谢您快速准确的回复。这完全回答了我的问题。我非常感激。祝您有美好的一天! - amisos55
啊,我明白了。一开始我想使用as.data.frame.table(x):但是我找不到一个合适的应用方式,只有dcast(as.data.frame.table(x), Var1 + Var2 ~ Var3, value.var="Freq")这种方法,但它不会很快。 - user20650
ftable(x) would be best if it returned something useful. or dd <- data.frame(as.table(x)); reshape(dd, dir = 'w', idvar = names(dd)[1:2], timevar = names(dd)[3]) - rawr
1
啊,对不起,我没有看到你的评论,关于dcast方法。 - gfgm
不,我接受了你的答案。不知道发生了什么事。再检查一遍。 - amisos55

6

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

感谢您的有益贡献。 - amisos55

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接