想象一下,我在R中有一个简单的4x3x2数组。
> 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
我想要的是,数组上的一个简单函数,它为我提供了任意维度的每个元素的索引名称。在这种情况下,维度2。
该功能的行为如下:
> 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"
答案 0 :(得分:4)
该功能只是
colmtx <- function(x, n) { return( array(
rep(dimnames(x)[[n]], each=prod(dim(x)[0:(n-1)])),
dim=dim(x) ) ) }
答案 1 :(得分:0)
我认为这是按预期工作的。我的编码最多可能有点狡猾,可能会有一个更简单的解决方案。
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)
}
}
答案 2 :(得分:0)
这是另一种方法。它同时获取所有维度的名称(虽然可以更改;我这样做是因为which
无论如何都返回了所有索引。
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))
})
}