所以我有一个数组列表,这个数组很大。简化版本如下所示:
> array_list <- list ( 'a1' = matrix(c(1,2,3,4),c(2,2)),
'a2' = matrix(c(5,6,7,8),c(2,2)))
我可以使用abind
使其成为一个三维数组:
> array3 <- abind(array_list, along=0)
我可以给出尺寸坐标名称:
> array3 <- abind(array_list, along=0,
new.names=list(c('one','two'), c('a','b'), c('u','v')))
> str(array3)
num [1:2, 1:2, 1:2] 1 5 2 6 3 7 4 8
- attr(*, "dimnames")=List of 3
..$ : chr [1:2] "one" "two"
..$ : chr [1:2] "a" "b"
..$ : chr [1:2] "u" "v"
但我不关心坐标。我真正想要做的是给尺寸本身命名(就像列表一样)。就是这样:
array3 <- abind(array_list, along=0, dim.names=c('array', 'x', 'y')
R> str(array3)
num [1:2, 1:2, 1:2] 1 5 2 6 3 7 4 8
- attr(*, "dimnames")=List of 3
..$ array: chr [1:2] "a1" "a2"
..$ x : NULL
..$ y : NULL
(注意$ ... :
)
这可能吗?如果是这样,怎么样?
答案 0 :(得分:2)
由于dimnames()
会返回一个列表,您可以使用names(dimnames(x)) <- ...
更改维度的名称。
例如,更改内置数据集Titanic
的名称:
str(Titanic)
table [1:4, 1:2, 1:2, 1:2] 0 0 35 0 0 0 17 0 118 154 ...
- attr(*, "dimnames")=List of 4
..$ Class : chr [1:4] "1st" "2nd" "3rd" "Crew"
..$ Sex : chr [1:2] "Male" "Female"
..$ Age : chr [1:2] "Child" "Adult"
..$ Survived: chr [1:2] "No" "Yes"
现在更改dimnames
的名称:
names(dimnames(Titanic)) <- paste0("Dim_", 1:4)
结果:
str(Titanic)
table [1:4, 1:2, 1:2, 1:2] 0 0 35 0 0 0 17 0 118 154 ...
- attr(*, "dimnames")=List of 4
..$ Dim_1: chr [1:4] "1st" "2nd" "3rd" "Crew"
..$ Dim_2: chr [1:2] "Male" "Female"
..$ Dim_3: chr [1:2] "Child" "Adult"
..$ Dim_4: chr [1:2] "No" "Yes"
答案 1 :(得分:1)
在编写这个问题的代码的过程中(正如我正在完成的那样)我想出了怎么做,所以我想我会发布它,为了别人的利益:
> array3 <- abind(array_list, along=0)
> dimnames <- c('array', 'x', 'y')
> str(array3)
num [1:2, 1:2, 1:2] 1 5 2 6 3 7 4 8
- attr(*, "dimnames")=List of 3
..$ array: NULL
..$ x : NULL
..$ y : NULL
这会删除坐标名称,但这对我的目的无关紧要。如果对您很重要,您可以这样做:
> array3 <- abind(array_list, along=0)
> array_names <- dimnames(array3)
> names(array_names) <- c('array', 'x', 'y')
> dimnames(array3) <- array_names
> str(array3)
num [1:2, 1:2, 1:2] 1 5 2 6 3 7 4 8
- attr(*, "dimnames")=List of 3
..$ array: chr [1:2] "a1" "a2"
..$ x : NULL
..$ y : NULL