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

按条件统计数据框布尔列中允许插入少量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

逻辑说明

  1. 分组标记:用rleid()给连续相同值的行分配唯一ID,确保每个连续TRUE/FALSE段独立分组。
  2. 分割边界识别:筛选出长度≥10的TRUE组,这些组是分割不同FALSE周期的边界。
  3. 块ID分配:通过cumsum()和shift(),将分割边界之间的所有非分割组划分为同一个块,分割组本身不参与统计。
  4. 周期长度计算:对每个块汇总所有组的长度,得到包含短TRUE的完整FALSE周期长度。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.15 16:25:38