2017-11-25 197 views
0

我对我这个愚蠢的问题道歉,但我刚开始熟悉数组。将矩阵内的矩阵旋转90度

我只需要旋转我的数组中的矩阵90度。

这里的一些数据和我的尝试至今:

mat1 = as.matrix(data.frame(col1 = c(1,2,3,4,5,6,7,8), col2 = c(2,3,'NA',5,6,7,8,9), col3 = c(3,4,5,6,7,8,9,10), col4 = c(2,3,4,1,2,6,7,8), 
          col5 = c(2,3,'NA','NA',6,7,8,9), col6 = c(1,2,3,5,6,7,8,9), col7 = c(1,2,3,4,6,7,'NA','NA'))) 


mat2 = as.matrix(data.frame(col1 = c('NA',2,3,4,5,6,7,8), col2 = c(2,3,1,5,6,7,8,9), col3 = c(3,4,5,6,7,8,9,'NA'), col4 = c(2,3,4,1,2,6,7,8), 
          col5 = c(2,3,11,88,6,7,8,9), col6 = c(1,2,3,5,6,7,8,9), col7 = c(1,2,3,4,6,7,'NA','NA'))) 

#ignore warnings 
class(mat1) = 'numeric' 
class(mat2) = 'numeric' 

my_array = array(c(mat1, mat2), dim = c(8,7,2)) 

我累了,但没有成功:

library(pracma) 

ar_rot = array(dim=c(8,7,2)) 

for (i in 1:2) { 
    ar_rot[,,i] = rot90(my_array[,,i], k = 1) 
} 

我认为问题在于对ar_rot的指标,因为如果我申请了相同的代码只有一个矩阵,例如

ar_rot_1 = rot90(my_array[,,1], k = 1) 

它的工作原理!但我的数组有数千个矩阵!

任何提示? 感谢

+1

对于这个简单的例子,你可以,也,实验与'aperm' - 例如这里'aperm(my_array,c(2,1,3))[dim(my_array)[2]:1,,]'似乎有用,尽管我不确定你需要的解决方案有多灵活 –

回答

0

我找到了解决我的问题的方式由数组转换为一个列表,应用功能,然后将列表转换回阵列:

lst = lapply(seq(dim(my_array)[3]), function(x) my_array[ , , x]) #convert to list 
lst = lapply(lst, function(x) rot90(x, 1)) #rotate 

#convert list back to array 
ar_rot = array(as.numeric(unlist(lst)), dim=c(7, 8, 2)) 

> print(ar_rot) 
, , 1 

    [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] 
[1,] 1 2 3 4 6 7 NA NA 
[2,] 1 2 3 5 6 7 8 9 
[3,] 2 3 NA NA 6 7 8 9 
[4,] 2 3 4 1 2 6 7 8 
[5,] 3 4 5 6 7 8 9 10 
[6,] 2 3 NA 5 6 7 8 9 
[7,] 1 2 3 4 5 6 7 8 

, , 2 

    [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] 
[1,] 1 2 3 4 6 7 NA NA 
[2,] 1 2 3 5 6 7 8 9 
[3,] 2 3 11 88 6 7 8 9 
[4,] 2 3 4 1 2 6 7 8 
[5,] 3 4 5 6 7 8 9 NA 
[6,] 2 3 1 5 6 7 8 9 
[7,] NA 2 3 4 5 6 7 8