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

如何用ifelse()或while()处理向量中1.2的相邻重复对?

用ifelse()或while()处理R向量中相邻重复1.2的简化需求

给定R向量:

a <- c(2, 1.2, 1.2, 2, 2, 2, 1.2, 1.2, 1.2, 2, 1.2, 2, 1.2, 1.2, 1.2, 1.2)

需要生成新向量b,规则为所有相邻成对重复的1.2仅保留一个,最终目标向量如下:

b <- c(2, 1.2, 2, 2, 2, 1.2, 1.2, 2, 1.2, 2, 1.2, 1.2)

以下是两种符合要求的实现方法:

方法一:使用while循环

逐元素遍历向量,遇到1.2时检查下一个元素是否同为1.2,若是则跳过下一个;非1.2元素直接保留。

a <- c(2, 1.2, 1.2, 2, 2, 2, 1.2, 1.2, 1.2, 2, 1.2, 2, 1.2, 1.2, 1.2, 1.2)
b <- c()
i <- 1
n <- length(a)

while(i <= n) {
  if(a[i] != 1.2) {
    b <- c(b, a[i])
    i <- i + 1
  } else {
    b <- c(b, a[i])
    # 若下一个元素也是1.2,跳过该元素
    if(i < n && a[i+1] == 1.2) {
      i <- i + 2
    } else {
      i <- i + 1
    }
  }
}

print(b)
# 输出结果:[1] 2.0 1.2 2.0 2.0 2.0 1.2 1.2 2.0 1.2 2.0 1.2 1.2

方法二:使用ifelse结合分组索引

通过分组标记连续的1.2片段,对每组内的1.2仅保留奇数位置的元素(即每两个相邻1.2留第一个),非1.2元素全部保留。

a <- c(2, 1.2, 1.2, 2, 2, 2, 1.2, 1.2, 1.2, 2, 1.2, 2, 1.2, 1.2, 1.2, 1.2)

# 生成分组:将连续的1.2归为一组,非1.2单独成组
group <- cumsum(c(TRUE, diff(a != 1.2) != 0))
# 生成保留逻辑:1.2元素保留组内奇数位,非1.2全保留
keep <- ifelse(
  a == 1.2,
  ave(rep(1, length(a)), group, FUN = function(x) seq_along(x) %% 2 == 1),
  TRUE
)

b <- a[keep]
print(b)
# 输出结果:[1] 2.0 1.2 2.0 2.0 2.0 1.2 1.2 2.0 1.2 2.0 1.2 1.2

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.10 11:16:12