R语言实现矩阵各连续行依次向右循环移位1个位置
R语言实现矩阵逐行循环移位操作
你需要实现的效果为逐行递进循环右移:首行保持a b c d e原顺序,后续每一行相对上一行整体右移1位,行尾溢出的元素补到行首,无需手动逐元素赋值,两种常用实现方式如下:
向量化实现(无循环,执行效率更高)
利用R的向量索引和取模运算直接构造目标矩阵,适合大维度矩阵场景:
# 定义基础序列与矩阵维度 base_seq <- letters[1:5] row_num <- 3 col_num <- length(base_seq) # 按移位规则生成每一行内容 result_mat <- t(sapply(0:(row_num - 1), function(shift_val){ # 计算右移shift_val位对应的列索引 col_index <- (1:col_num - shift_val - 1) %% col_num + 1 base_seq[col_index] })) # 打印结果 print(result_mat)
运行输出与预期完全一致:
[,1] [,2] [,3] [,4] [,5] [1,] "a" "b" "c" "d" "e" [2,] "e" "a" "b" "c" "d" [3,] "d" "e" "a" "b" "c"
循环实现(逻辑直观易理解)
如果更习惯循环写法,可以从第二行开始逐行基于上一行的内容做移位,代码可读性更强:
# 生成原始矩阵 ori_mat <- matrix(data = rep(letters[1:5], 3), nrow = 3, ncol = 5, byrow = TRUE) col_num <- ncol(ori_mat) # 从第二行开始逐行移位 for (i in 2:nrow(ori_mat)) { prev_row <- ori_mat[i-1, ] # 取上一行最后一个元素,拼接上一行除最后一个元素外的内容,实现右移1位 ori_mat[i, ] <- c(prev_row[col_num], prev_row[-col_num]) } # 打印结果 print(ori_mat)
两种方式输出结果完全一致,如果需要调整移位方向为左移,只要把拼接逻辑改为「上一行第一个元素拼接到上一行除第一个元素外的内容末尾」即可。
内容的提问来源于stack exchange,提问作者MJL
相关产品推荐
相关产品推荐

