# Convert the matrices in a 3D array into three-column format

I have a 3D array of dimensions 13 x 15 x 1000, that is, an array of 1000, 13 x 15 matrices, which is called nulls.qs. I want to convert its matrices into three columns format of 195 x 3, to get a 3D array of dimensions 195 x 3 x 1000, called netfun.nulls.qs.

I have created an empty 3D array and I’m trying to fill it with a for loop that converts each matrix by using `as.data.frame(as.table)`. This this my code:

``````netfun.nulls.qs <- array(0, dim = c(195,3,1000))
for (i in 1:1000) {netfun.nulls.qs[,,i]<-as.data.frame(as.table(nulls.qs[,,i]))}
``````

I`m getting this error:

``````Error in netfun.nulls.qs[, , i] <- as.data.frame(as.table(nulls.qs[, ,  : incorrect number of subscripts
``````

I don’t know where the problem should be. I appreciate any suggestion.

### >Solution :

You don’t need an explicit loop here. You can use `apply` along the third dimension of your array:

``````netfun.nulls.qs <- apply(nulls.qs, 3, function(x) as.data.frame(as.table(x)))
``````

Your first entry will look like this:

``````head(netfun.nulls.qs[[1]])
#>   Var1 Var2 Freq
#> 1    A    A    1
#> 2    B    A    2
#> 3    C    A    3
#> 4    D    A    4
#> 5    E    A    5
#> 6    F    A    6
``````

If you want the result to be a matrix, then you need to remember that a matrix needs to have all the same data type, whereas `as.data.frame(table(x))` produces a data frame with two character columns and one numeric column. To get it as an array we would need to do something like:

``````netfun.nulls.qs <- apply(nulls.qs, 3, function(x) {
as.matrix(as.data.frame(as.table(x))), simplify = FALSE)
})

do.call(abind::abind, c(netfun.nulls.qs, along = 3))
``````