在R中标记非连续数字(重复数字不标记,标记非连续后数字)
解决方法
要实现标记非连续数字后的第一个数字且重复数字不标记的需求,核心逻辑是:
- 第一行无前置数字,标记为0
- 若当前数字与前一行数字重复,标记为0
- 若当前数字不等于前一行数字+1(且不重复),标记为1
- 其余情况(连续递增1)标记为0
方法1:使用dplyr包
借助dplyr的lag()函数获取前一行数值,结合case_when()进行条件判断:
library(dplyr) x <- data.frame(hour = c(1,2,3,5,6,6,7,9,10,11,11,1,5,6,10,11,20,2,3)) x <- x %>% mutate( flag = case_when( row_number() == 1 ~ 0, hour == lag(hour) ~ 0, hour != lag(hour) + 1 ~ 1, TRUE ~ 0 ) ) print(x)
方法2:基础R实现
通过循环遍历每行,直接对比当前与前一行的数值关系:
x <- data.frame(hour = c(1,2,3,5,6,6,7,9,10,11,11,1,5,6,10,11,20,2,3)) # 初始化flag列 x$flag <- 0 # 从第2行开始逐个判断 for(i in 2:nrow(x)){ current <- x$hour[i] prev <- x$hour[i-1] if(current != prev && current != prev + 1){ x$flag[i] <- 1 } } print(x)
执行上述任意一种方法后,得到的结果与期望完全一致:
hour flag 1 1 0 2 2 0 3 3 0 4 5 1 5 6 0 6 6 0 7 7 0 8 9 1 9 10 0 10 11 0 11 11 0 12 1 1 13 5 1 14 6 0 15 10 1 16 11 0 17 20 1 18 2 1 19 3 0
内容的提问来源于stack exchange,提问作者fishlakeslimno
相关产品推荐
相关产品推荐

