如何在R中实现矩阵每行随机抽取指定数量的列
R语言实现矩阵每行随机抽取指定数量列的方法
基础实现(易理解,适合中小规模矩阵)
我们先构造测试矩阵方便验证效果,你给出的示例矩阵可调整为带值的版本:
# 构造3行4列的测试矩阵,按行填充1~12 A <- matrix(1:12, nrow = 3, ncol = 4, byrow = TRUE) print(A) # 输出: # [,1] [,2] [,3] [,4] # [1,] 1 2 3 4 # [2,] 5 6 7 8 # [3,] 9 10 11 12
使用apply逐行独立抽样,直接得到每行的抽样结果:
# 方式1:仅获取每行随机抽取的2列的索引 sample_col_idx <- t(apply(A, 1, function(row) sample(seq_along(row), size = 2))) print(sample_col_idx) # 运行结果示例(每次随机,结果不固定): # [,1] [,2] # [1,] 2 4 # [2,] 1 3 # [3,] 3 1
如果需要直接得到抽取后的数值,可直接在函数内抽样元素:
# 方式2:直接获取每行抽取后的数值 sampled_data <- t(apply(A, 1, function(row) sample(row, size = 2))) print(sampled_data) # 对应上述索引的输出示例: # [,1] [,2] # [1,] 2 4 # [2,] 5 7 # [3,] 11 9
高效实现(适合超大规模矩阵)
如果矩阵行数超过10万,apply的循环效率偏低,可以用向量化操作提速:
n_row <- nrow(A) n_col <- ncol(A) sample_size <- 2 # 每行抽取的列数,可按需调整 # 生成对应行列的索引 row_pos <- rep(seq_len(n_row), each = sample_size) col_pos <- as.vector(replicate(n_row, sample(seq_len(n_col), sample_size))) # 按索引提取元素并整合成矩阵 sampled_data <- matrix(A[cbind(row_pos, col_pos)], nrow = n_row, byrow = TRUE)
补充说明
如果需要固定随机结果方便复现,可在运行抽样代码前执行set.seed(自定义整数),比如set.seed(123),后续每次运行都会得到相同的抽样结果。
内容的提问来源于stack exchange,提问作者Rlearner
相关产品推荐
相关产品推荐

