如何在R语言多维数组的各列中应用sample()函数进行置换?
问题描述
先通过以下代码创建三维数组:
x <- 1:24 dim(x) <- c(2, 4, 3)
运行后输出的初始数组结构如下:
> x , , 1 [,1] [,2] [,3] [,4] [1,] 1 3 5 7 [2,] 2 4 6 8 , , 2 [,1] [,2] [,3] [,4] [1,] 9 11 13 15 [2,] 10 12 14 16 , , 3 [,1] [,2] [,3] [,4] [1,] 17 19 21 23 [2,] 18 20 22 24
需求是:利用sample()函数对跨矩阵的列进行置换——例如所有矩阵的第1列元素(1、2、9、10、17、18)需在这3个矩阵的第1列范围内打乱,但最终仍保留在第1列;其他列按同样规则处理。示例置换结果如下:
> x , , 1 [,1] [,2] [,3] [,4] [1,] 10 11 5 23 [2,] 2 19 22 8 , , 2 [,1] [,2] [,3] [,4] [1,] 1 3 6 24 [2,] 17 12 14 16 , , 3 [,1] [,2] [,3] [,4] [1,] 9 4 21 7 [2,] 18 20 13 15
解决方案
核心逻辑是针对每一列,提取所有层的该列元素,打乱后重新填充回原列的位置。可以用apply()结合sample()实现:
# 按列(第2维度)遍历处理 x_permuted <- apply(x, 2, function(col) { # 将当前列的所有元素转为向量并打乱 permuted_vals <- sample(c(col)) # 恢复原列的维度(2行 × 3层) dim(permuted_vals) <- dim(col) permuted_vals }) # 还原为原三维数组的结构(2行,4列,3层) dim(x_permuted) <- dim(x)
代码说明
apply(x, 2, ...):指定按三维数组的第2维度(列)进行遍历,每次迭代传入的col是一个2×3的矩阵,对应所有层的当前列元素。sample(c(col)):把矩阵col平铺为长度6的向量,通过sample()完成无放回随机打乱。- 恢复维度并调整最终结构:打乱后的向量重新转为
2×3的矩阵,最后把apply返回的结果调整为原数组的2×4×3维度,保证结构一致。
运行上述代码后,每一列的元素都会在该列内部跨层随机置换,不会跑到其他列,符合需求。
内容的提问来源于stack exchange,提问作者dputhier
相关产品推荐
相关产品推荐

