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

在R语言中如何将向量中连续TRUE值替换为连续出现次数

解决方案

基础R方法(无需额外包)

利用rle()函数处理连续重复值,这是最直接的实现方式:

# 定义输入向量
vel <- c(FALSE, FALSE, FALSE, TRUE, TRUE, FALSE, TRUE, TRUE, TRUE, TRUE, 
         TRUE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, 
         TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, 
         TRUE, TRUE, TRUE, TRUE)

# 提取连续重复段的长度和对应值
rle_result <- rle(vel)

# 为每个连续段生成目标值
segments <- mapply(function(val, len) {
  if (val) rep(len, len) else rep(0, len)
}, rle_result$values, rle_result$lengths)

# 合并为最终向量
vel.con <- unlist(segments)

# 查看结果
vel.con

运行后输出符合预期的结果:

[1]  0  0  0  2  2  0  5  5  5  5  5  0  0  0  0  0  0  0  0 15 15 15 15 15
[25] 15 15 15 15 15 15 15 15 15 15

dplyr方法(适配数据框场景)

如果你的逻辑变量存储在数据框中,用dplyr的分组操作也能实现需求:

library(dplyr)

# 构造示例数据框
df <- tibble(vel = vel)

df <- df %>%
  # 标记连续相同值的分组ID
  mutate(group_id = cumsum(vel != lag(vel, default = !vel[1]))) %>%
  group_by(group_id) %>%
  # 对TRUE组填充连续出现次数,FALSE组填充0
  mutate(vel.con = ifelse(vel, n(), 0)) %>%
  ungroup()

# 提取结果向量
vel.con <- df$vel.con

原理说明

  • rle()函数会返回两个核心向量:lengths记录每个连续段的长度,values记录对应段的取值(TRUE/FALSE)。
  • 针对每个连续段,TRUE段重复自身长度值,FALSE段重复0,最后合并所有段即可得到等长的目标向量。

内容的提问来源于stack exchange,提问作者Jesús Olivares-Jabalera

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.16 13:30:42