Reputation: 363
Imagine I have a simple 4x3x2 array in R.
> x <- array(1:24,c(4,3,2), dimnames=list(c('a','b','c','d'),c('x','y','z'),1:2))
> x
, , 1
x y z
a 1 5 9
b 2 6 10
c 3 7 11
d 4 8 12
, , 2
x y z
a 13 17 21
b 14 18 22
c 15 19 23
d 16 20 24
What I'd like, is a simple function on the array that gives me back the name of the index of each element for an arbitrary dimension. In this case, dimension 2.
The function would behave like this:
> arraydims(x,2) #Where 2 is dimension I want names for.
, , 1
[,1] [,2] [,3]
[1,] "x" "y" "z"
[2,] "x" "y" "z"
[3,] "x" "y" "z"
[4,] "x" "y" "z"
, , 2
[,1] [,2] [,3]
[1,] "x" "y" "z"
[2,] "x" "y" "z"
[3,] "x" "y" "z"
[4,] "x" "y" "z"
Upvotes: 2
Views: 1378
Reputation: 37754
Here's another way to do it. It gets the names for all dimensions at once (though that could be changed; I did it that way because the which
returned all the indices anyway.
arraydims <- function(x) {
x[] <- 1
idx <- which(x==1, arr.ind=TRUE)
lapply(1:ncol(x), function(k) {
array(dimnames(x)[[k]][idx[,k]], dim(x), dimnames=dimnames(x))
})
}
Upvotes: 0
Reputation: 263332
The function is just
colmtx <- function(x, n) { return( array(
rep(dimnames(x)[[n]], each=prod(dim(x)[0:(n-1)])),
dim=dim(x) ) ) }
Upvotes: 4
Reputation: 93813
I think this works as intended. My coding is probably a bit dodgy at best and there may well be a more straightforward solution.
arraydims <- function(arrname,arrdim) {
#rows
if(arrdim==1) {
arrname[,,] <- dimnames(arrname)[[1]]
print(arrname)
}
#columns
if(arrdim==2) {
arrname[,,] <- rep(dimnames(arrname)[[2]],each=dim(arrname)[1])
print(arrname)
}
#tables
if(arrdim==3) {
arrname[,,] <- rep(dimnames(arrname)[[3]],each=dim(arrname)[1]*dim(arrname)[2])
print(arrname)
}
}
Upvotes: 0