如何循环数据集行,并查看每一行是否与前一行连续



我有一个带有一列的数据帧。它列出了大量的数字,其中有些是连续的,有些不是。我希望代码确定一行是否比前一行中的数字多出小于或等于10000。如果这对于五个或更多连续行是真的,那么我需要保留这些行,如果是假的,那么丢弃它们。

一个示例数据集如下,但我真的陷入了循环。。。。

x
560001
110230001
121480001
152760001
8580001
66590001
66600001
66610001
66620001
66630001
66640001
66650001
66660001
66670001
66680001
66690001

预期输出为

66590001
66600001
66610001
66620001
66630001
66640001
66650001
66660001
66670001
66680001
66690001

我想这可能会让你达到目标:

xdiff <- c(FALSE, diff(d$x) <= 10000)
xrle <- rle(xdiff)
xrle$values <- xrle$lengths >= 5
d[inverse.rle(xrle),, drop = FALSE]

结果:

          x
7  66600001
8  66610001
9  66620001
10 66630001
11 66640001
12 66650001
13 66660001
14 66670001
15 66680001
16 66690001

这里有一个使用rle和行索引的选项(假设您的数据集称为df

indx <- c(FALSE, diff(df$x) <= 1e4)
indx2 <- rle(indx)$lengths
indx2 <- rep(indx2, indx2)
df[indx2 >= 5 & indx,, drop = FALSE]
# x
# 7  66600001
# 8  66610001
# 9  66620001
# 10 66630001
# 11 66640001
# 12 66650001
# 13 66660001
# 14 66670001
# 15 66680001
# 16 66690001

您也可以尝试

indx <- c(FALSE, df$x[-1] <=df$x[-nrow(df)]+10000)
indx2 <- cumsum(c(0, diff(indx))==1)
df[ave(indx, indx2, FUN= sum)>=5 & indx,, drop=FALSE]
#          x
#7  66600001
#8  66610001
#9  66620001
#10 66630001
#11 66640001
#12 66650001
#13 66660001
#14 66670001
#15 66680001
#16 66690001

最新更新