You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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)

代码说明

  1. apply(x, 2, ...):指定按三维数组的第2维度(列)进行遍历,每次迭代传入的col是一个2×3的矩阵,对应所有层的当前列元素。
  2. sample(c(col)):把矩阵col平铺为长度6的向量,通过sample()完成无放回随机打乱。
  3. 恢复维度并调整最终结构:打乱后的向量重新转为2×3的矩阵,最后把apply返回的结果调整为原数组的2×4×3维度,保证结构一致。

运行上述代码后,每一列的元素都会在该列内部跨层随机置换,不会跑到其他列,符合需求。

内容的提问来源于stack exchange,提问作者dputhier

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.21 19:37:27