2016-12-01 3 views
3

У меня есть массив, включающий две переменные умения (theta0, theta1) над элементом (Да, Нет), называемый «comp». Это нужно преобразовать в одну матрицу. Есть ли способ преобразовать матрицу, подобную той, которая находится внизу?Преобразование массива в матрицу в R

Мой массив выглядит следующим образом:

>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

'tidyr :: s pread (as.data.frame.table (priCPT.i6), Var3, Freq) ' – alistaire

ответ

6

Вы можете легко получить столбцы значений уплощение матрицы на 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]) 

Теперь вы можете объединить их в кадр данных (вы defin Itely нужен кадр данных, чем матрица, так как столбцы 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

+0

ах я вижу. Первоначально я думал об использовании 'as.data.frame.table (x)': но я не мог видеть хороший способ применить соответствующим образом, только 'dcast (as.data.frame.table (x), Var1 + Var2 ~ Var3, value.var = "Freq") ', который не будет быстрым – user20650

+0

' ftable (x) 'было бы лучше, если бы оно вернуло что-то полезное. или 'dd <- data.frame (as.table (x)); reshape (dd, dir = 'w', idvar = names (dd) [1: 2], timevar = names (dd) [3]) ' – rawr

3

Альтернативы использования reshape2 бы 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

Спасибо за полезную запись. – amisos55