在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
相关产品推荐
相关产品推荐

