r - 如何在 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
我应该如何定义和访问矩阵的每个元素和包含的数组的每个元素?
解决方案
我想我明白:(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
推荐阅读
- python - 无法将 Pytorch 转换为 ONNX
- php - 如何在 PHP7 中做同样的 Nodejs 加密 aes 加密 CTR?
- javascript - 猫鼬模型,字符串数组,对象数组结构
- javascript - 添加新选择框时如何控制选择框?
- java - 如何访问在另一个类中定义的对象?
- javascript - Jquery Serialize 无法发布到 laravel 控制器
- python - 使用 gensim 加载训练有素的 fasttext 模型时出现问题
- keyboard - 我安装了一个注册表来更改我的键盘布局。如何卸载
- php - 如何通过 PHP 从 JSON 中获取 stdObject 功能
- python - Python PyQt5 webview无法打开没有url创建的标签