我有一个带有一列的数据帧。它列出了大量的数字,其中有些是连续的,有些不是。我希望代码确定一行是否比前一行中的数字多出小于或等于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