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

在R中基于前后值按阈值分组枚举布尔序列元素的问题

Solution for Grouping Boolean Values by Thresholded Intervals

Alright, let's solve this grouping problem in R. The goal is to cluster TRUE values (and the FALSEs between them that fall within your threshold of 5) into unique set IDs, resetting the grouping whenever a TRUE is too far from the last one. Here's a step-by-step solution that's both clear and efficient:

Step 1: Define Your Input Data

First, let's formalize the input vectors you provided (I renamed switch to switch_vec since switch is a built-in R function to avoid conflicts):

# Input boolean vector
switch_vec <- c(TRUE, TRUE, FALSE, TRUE, rep(FALSE, 6), TRUE, rep(FALSE, 7), TRUE, TRUE, TRUE, FALSE, TRUE)
# Threshold for maximum allowed gap between TRUEs
threshold <- 5

Step 2: Calculate Distance Metrics

We need two key metrics to determine group membership:

  1. Steps since the last TRUE for each position
  2. Steps until the next TRUE for each position
# Calculate steps since the last TRUE
steps_since_true <- integer(length(switch_vec))
current_step <- Inf
for (i in seq_along(switch_vec)) {
  if (switch_vec[i]) {
    current_step <- 0
  } else {
    current_step <- current_step + 1
  }
  steps_since_true[i] <- current_step
}

# Calculate steps until the next TRUE
steps_to_next_true <- integer(length(switch_vec))
current_step <- Inf
for (i in rev(seq_along(switch_vec))) {
  if (switch_vec[i]) {
    current_step <- 0
  } else {
    current_step <- current_step + 1
  }
  steps_to_next_true[i] <- current_step
}

Step 3: Assign Group IDs to TRUE Values

First, we'll assign unique group IDs to clusters of TRUEs where the gap between consecutive TRUEs is ≤ threshold:

# Initialize set IDs with NA
set_ids <- rep(NA_integer_, length(switch_vec))
# Get positions of all TRUE values
true_pos <- which(switch_vec)

# Identify boundaries where a new group should start (gap > threshold + 1 means more than threshold FALSEs between TRUEs)
group_boundaries <- c(1, which(diff(true_pos) > threshold + 1) + 1)

# Assign group IDs to each TRUE cluster
for (g in seq_along(group_boundaries)) {
  start_idx <- group_boundaries[g]
  end_idx <- if (g < length(group_boundaries)) group_boundaries[g+1] - 1 else length(true_pos)
  set_ids[true_pos[start_idx:end_idx]] <- g
}

Step 4: Propagate Group IDs to Nearby FALSE Values

Now we'll extend group IDs to FALSEs that are within the threshold distance of a TRUE in the same group:

# Forward fill: assign group ID to FALSEs within threshold of the last TRUE
for (i in 2:length(set_ids)) {
  if (is.na(set_ids[i]) && !is.na(set_ids[i-1]) && steps_since_true[i] <= threshold) {
    set_ids[i] <- set_ids[i-1]
  }
}

# Backward fill: assign group ID to FALSEs within threshold of the next TRUE
for (i in rev(2:length(set_ids))) {
  if (is.na(set_ids[i]) && !is.na(set_ids[i+1]) && steps_to_next_true[i] <= threshold) {
    set_ids[i] <- set_ids[i+1]
  }
}

# Replace remaining NA (FALSEs too far from any TRUE) with 0
set_ids[is.na(set_ids)] <- 0

Step 5: Generate the Final Result

Let's package everything into a data frame matching your desired output format:

# Create result data frame
result <- data.frame(
  row = seq_along(switch_vec),
  VALUE = switch_vec,
  SET = set_ids
)

# Print the result
print(result, row.names = FALSE)

Output Preview

The output will look like this (truncated for brevity):

row VALUE SET
   1  TRUE   1
   2  TRUE   1
   3 FALSE   1
   4  TRUE   1
   5 FALSE   1
   6 FALSE   1
   7 FALSE   1
   8 FALSE   1
   9 FALSE   1
  10 FALSE   0
  11  TRUE   2
  ...

This solution ensures that all TRUEs within the threshold gap are grouped together, and any FALSEs within the threshold of a group's TRUEs are included in that group. FALSEs that are too far from any TRUE get a set ID of 0.

内容的提问来源于stack exchange,提问作者Gabriele B

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 07:49:02