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

如何在R语言滚动窗口中标记重复元素?求助Rollapplyr实现

R语言实现滚动窗口内重复元素标记

需求:检查每行的value是否在后续2行中重复出现,存在则标记flag=TRUE,否则为FALSE。

方法一:使用dplyr包(推荐,代码简洁)

借助lead()函数获取后续行的值,通过逻辑判断实现标记:

library(dplyr)

# 构造示例数据
df <- tibble(
  row_number = c(1,2,3,4,5,6,7),
  value = c(2,2,1,3,2,6,2)
)

# 生成flag列
df <- df %>%
  mutate(
    flag = (value == lead(value, n = 1, default = NA) | 
            value == lead(value, n = 2, default = NA)) %>%
           replace_na(FALSE)
  )

# 查看结果
print(df)

代码说明:

  • lead(value, n=1)获取当前行下1行的value,n=2则获取下2行的值;
  • default=NA避免最后2行因无后续数据报错;
  • 用replace_na(FALSE)将最后2行的NA转为FALSE(因为它们没有足够的后续行,无法满足重复条件)。

方法二:Base R实现(无需额外包)

通过遍历每行,检查后续窗口内的元素:

# 构造示例数据
df <- data.frame(
  row_number = c(1,2,3,4,5,6,7),
  value = c(2,2,1,3,2,6,2)
)

# 生成flag列
df$flag <- sapply(1:nrow(df), function(i) {
  # 确定后续2行的有效范围,避免超出数据行数
  window_range <- (i+1):min(i+2, nrow(df))
  # 判断当前value是否在窗口内重复
  any(df$value[i] == df$value[window_range])
})

# 查看结果
print(df)

代码说明:

  • sapply()遍历每一行索引i;
  • min(i+2, nrow(df))确保窗口不会超出数据最后一行;
  • any()判断窗口内是否存在与当前行value相等的元素。

输出结果

两种方法都会得到符合需求的结果:

row_numbervalueflag
12TRUE
22FALSE
31FALSE
43FALSE
52TRUE
66FALSE
72FALSE

内容的提问来源于stack exchange,提问作者Hanifa Pilvar

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.19 02:51:02