首页 > 解决方案 > 如何在 R 中制作数组矩阵?

问题描述

我想要的是一个矩阵,其中每个元素都是一个数组本身。这个数组是一个数据帧的子集,但是这个例子可以推广到任何数组。

我试过:

My_matrix <- matrix(array(), nrow = NROW, ncol =  NCOL) 

for (i in 1:NROW){
  for(j in 1:NCOL){
    My_matrix[i,j] <- df[df$var1 == j & df$var2== i,]$var3
  }
} 

但我收到此消息错误:

Error in My_matrix[i,j] <- df[df$var1== j & df$var2== i,]$var3 : 
  number of items to replace is not a multiple of replacement length

我应该如何定义和访问矩阵的每个元素和包含的数组的每个元素?

标签: rarraysmatrix

解决方案


我想我明白:(1)基本数组是45x3;(2) 每个单元格都有一个不同大小的矩阵;(3) 这是先验未知的。明白了。不可能。数组(矩阵)的维度总是完美的,虽然您可以动态更改一个或多个维度,但您可以针对所有单元格进行更改。

替代方案:list-columns

dat <- data.frame(x=1:3, y=11:13)
dat$z <- lapply(3:5, function(i) matrix(seq_len(i^2), nr=i))
dat
#   x  y
# 1 1 11
# 2 2 12
# 3 3 13
#                                                                                           z
# 1                                                                 1, 2, 3, 4, 5, 6, 7, 8, 9
# 2                                     1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16
# 3 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25

这看起来不是很吸引人,但是如果您想要不同的演示文稿,您可以考虑将其分配为tibble::tbl_df(也可以在dplyr加载时使用)。(请注意,表示不同于存储可访问性。)

library(tibble)
as_tibble(dat)
# # A tibble: 3 x 3
#       x     y z                
#   <int> <int> <list>           
# 1     1    11 <int[,3] [3 x 3]>
# 2     2    12 <int[,4] [4 x 4]>
# 3     3    13 <int[,5] [5 x 5]>

子集是一致的:

dat$z[ dat$x == 2 & dat$y == 12 ]
# [[1]]
#      [,1] [,2] [,3] [,4]
# [1,]    1    5    9   13
# [2,]    2    6   10   14
# [3,]    3    7   11   15
# [4,]    4    8   12   16

### note that you need an extra [[1]] to get to the real data
m <- dat$z[ dat$x == 2 & dat$y == 12 ][[1]]
m
#      [,1] [,2] [,3] [,4]
# [1,]    1    5    9   13
# [2,]    2    6   10   14
# [3,]    3    7   11   15
# [4,]    4    8   12   16
m[3,4]
# [1] 15

推荐阅读