我有一个数组,包括一个名为" 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 .. ..
...问候
答案 0 :(得分:9)
通过在第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]]))
剩下的就是附加&#34; dimnames&#34;列:
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 :(得分: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