R语言如何交换向量中每两个相邻元素的位置(偶数位前移)
R向量相邻奇偶位交换排序实现
现有已知条件
- 初始向量:
vector_have <- c("A", "B", "C", "A1", "B2", "C3") # 控制台输出 [1] "A" "B" "C" "A1" "B2" "C3"
- 目标输出向量:
vector_wanted <- c("A1", "A", "B2", "B", "C3", "C") # 控制台输出 [1] "A1" "A" "B2" "B" "C3" "C"
- 已尝试方案的输出:
直接调用默认排序函数得到的结果不符合需求,输出为:
sort(vector_have) [1] "A" "A1" "B" "B2" "C" "C3"
核心需求:将排序后向量中每个偶数位置的元素,与其前一位相邻的奇数位置元素交换位置。
可行实现方案
方案1:索引配对重排(写法最简洁)
不需要写循环迭代,直接构造位置索引即可完成交换,完全适配逻辑索引的实现思路:
# 先完成基础排序 v_sorted <- sort(vector_have) # 生成奇偶位置序列 odd_pos <- seq(1, length(v_sorted), by = 2) even_pos <- seq(2, length(v_sorted), by = 2) # 按偶位、奇位的配对顺序拼接索引,取子集得到结果 vector_res <- v_sorted[c(rbind(even_pos, odd_pos))]
运行后验证结果:
vector_res [1] "A1" "A" "B2" "B" "C3" "C"
和目标向量完全一致。
方案2:逻辑向量取子集
用交替TRUE/FALSE的逻辑向量分别筛选奇偶位元素,再按配对顺序重组:
v_sorted <- sort(vector_have) # 构造长度匹配的逻辑向量:奇数位为FALSE,偶数位为TRUE is_even_pos <- rep(c(FALSE, TRUE), length.out = length(v_sorted)) # 重组元素 vector_res <- c(rbind(v_sorted[is_even_pos], v_sorted[!is_even_pos]))
输出结果和方案1完全相同。
适配提示:如果实际使用时向量长度为奇数,只需要在结果末尾补上排序后向量的最后一个元素(即未配对的最后一个奇数位元素)即可。
内容的提问来源于stack exchange,提问作者TarJae
相关产品推荐
相关产品推荐

