如何在含多1值的indicator向量周边生成指定大小的标记区域?
解决方案
核心思路是:先提取所有indicator为1的行号,针对每个目标行号生成前后指定范围的行号区间,合并所有区间后标记对应行即可处理多个1的场景。
步骤1:构造初始数据
library(dplyr) # 创建初始数据框 df <- tibble(row = 1:20, indicator = rep(c(rep(0, 5), 1, rep(0, 4)), 2))
步骤2:定义生成标记列的函数
# 输入数据框和区域大小N,返回对应的标记列 get_region <- function(data, n) { # 计算目标行前后需要覆盖的行数(N为奇数时,前后各(n-1)/2行) offset <- (n - 1) %/% 2 # 提取所有indicator为1的行号 target_rows <- data$row[data$indicator == 1] # 生成每个目标行对应的标记行范围 marked_rows <- unlist(lapply(target_rows, function(x) seq(x - offset, x + offset))) # 过滤掉超出数据框行号范围的数值 marked_rows <- marked_rows[marked_rows %in% data$row] # 将行号匹配结果转为0/1标记 as.integer(data$row %in% marked_rows) }
步骤3:生成所需的region列
# 添加N=1、3、5对应的标记列 df <- df %>% mutate(region_n1 = get_region(., 1), region_n3 = get_region(., 3), region_n5 = get_region(., 5)) # 查看最终结果 print(df, n = 20)
运行后即可得到与示例一致的输出,该方法支持任意数量的indicator=1的行,且能灵活扩展不同大小的区域标记。
内容的提问来源于stack exchange,提问作者Oscar
相关产品推荐
相关产品推荐

