如何在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_number | value | flag |
|---|---|---|
| 1 | 2 | TRUE |
| 2 | 2 | FALSE |
| 3 | 1 | FALSE |
| 4 | 3 | FALSE |
| 5 | 2 | TRUE |
| 6 | 6 | FALSE |
| 7 | 2 | FALSE |
内容的提问来源于stack exchange,提问作者Hanifa Pilvar
相关产品推荐
相关产品推荐

