R语言使用rle与dplyr查找布尔向量连续TRUE末尾位置异常问题
问题原因
你当前代码的核心错误是:last()返回的是符合要求的游程的长度值,而非该游程在rle返回结果中的位置索引,用长度值去索引cumsum(rle(is_reaching)$lengths)的结果,自然无法得到正确的末尾位置。
正确实现代码
基础R版本
# 存储rle结果,避免重复计算 rle_res <- rle(is_reaching) # 筛选同时满足「值为TRUE」「长度大于40」的游程索引 valid_run_idx <- which(rle_res$values == TRUE & rle_res$lengths > 40) # 取最后一个符合要求的游程的索引 last_run_idx <- tail(valid_run_idx, 1) # 计算该游程的末尾索引 transport_phase_end <- cumsum(rle_res$lengths)[last_run_idx]
如果不存在符合条件的游程,你可以自行补充逻辑处理NA的情况。
dplyr分组适配版本
如果是在分组数据框中计算,可直接用mutate配合自定义逻辑实现:
library(dplyr) df <- df %>% group_by(你的分组列名) %>% mutate(transport_phase_end = { rle_res <- rle(is_reaching) valid_run_idx <- which(rle_res$values == TRUE & rle_res$lengths > 40) # 无符合条件的游程时返回NA,避免报错 if(length(valid_run_idx) == 0) { NA_integer_ } else { cumsum(rle_res$lengths)[tail(valid_run_idx, 1)] } }) %>% ungroup()
内容的提问来源于stack exchange,提问作者Reid
相关产品推荐
相关产品推荐

