按条件统计数据框布尔列中允许插入少量TRUE的连续FALSE周期长度
解决方案
要实现你需要的统计逻辑,核心是先识别出连续10行及以上的TRUE段作为分割边界,再将原序列按这些边界拆分成多个子段,每个子段的总长度就是符合条件的FALSE周期长度(子段内可包含连续不超过10行的TRUE)。以下是基于data.table的实现步骤:
单向量处理示例(针对你的示例向量a)
library(data.table) # 示例向量 a <- c(FALSE, FALSE, FALSE, TRUE, TRUE, FALSE, TRUE, TRUE, FALSE, TRUE, TRUE, TRUE, TRUE,TRUE, TRUE,TRUE, TRUE,TRUE, TRUE, FALSE, FALSE) # 1. 给连续相同值的行分配分组ID dt <- data.table(a = a) dt[, rleid_id := rleid(a)] # 2. 汇总每个分组的类型(TRUE/FALSE)和长度 group_stats <- dt[, .(is_true = first(a), group_length = .N), by = rleid_id] # 3. 标记分割边界:连续10行及以上的TRUE组 group_stats[, is_split := is_true & group_length >= 10] # 4. 给非分割组分配块ID(分割组不参与统计) group_stats[, block_id := ifelse(is_split, NA_integer_, cumsum(shift(is_split, fill = FALSE)) + 1)] # 5. 按块ID汇总每个周期的总长度 result <- group_stats[!is_split, .(period_length = sum(group_length)), by = block_id] # 提取结果向量 result_vec <- result$period_length print(result_vec) # 输出:[1] 9 2
多列数据框处理
如果你的数据框包含多列布尔数据,可以封装成函数批量处理:
library(data.table) # 示例数据框 df <- data.table( a = c(FALSE, FALSE, FALSE, TRUE, TRUE, FALSE, TRUE, TRUE, FALSE, TRUE, TRUE, TRUE, TRUE,TRUE, TRUE,TRUE, TRUE,TRUE, TRUE, FALSE, FALSE), b = c(FALSE, TRUE, FALSE, TRUE, TRUE, TRUE, TRUE, FALSE, FALSE, TRUE, TRUE, TRUE, TRUE,TRUE, TRUE,TRUE, TRUE,TRUE, TRUE, FALSE, TRUE) ) # 定义处理单列的函数,返回周期数量和长度列表 process_col <- function(x) { dt <- data.table(val = x) dt[, rleid_id := rleid(val)] group_stats <- dt[, .(is_true = first(val), group_length = .N), by = rleid_id] group_stats[, is_split := is_true & group_length >= 10] group_stats[, block_id := ifelse(is_split, NA_integer_, cumsum(shift(is_split, fill = FALSE)) + 1)] result <- group_stats[!is_split, .(period_length = sum(group_length)), by = block_id] list(period_count = nrow(result), period_lengths = result$period_length) } # 应用到数据框的每一列 column_results <- lapply(df, process_col) # 查看结果 column_results
逻辑说明
- 分组标记:用
rleid()给连续相同值的行分配唯一ID,确保每个连续TRUE/FALSE段独立分组。 - 分割边界识别:筛选出长度≥10的TRUE组,这些组是分割不同FALSE周期的边界。
- 块ID分配:通过
cumsum()和shift(),将分割边界之间的所有非分割组划分为同一个块,分割组本身不参与统计。 - 周期长度计算:对每个块汇总所有组的长度,得到包含短TRUE的完整FALSE周期长度。
内容的提问来源于stack exchange,提问作者Linar Akhmetzyanov
相关产品推荐
相关产品推荐

