我试图在每个类部分的最大索引之后跳过一定数量的行。我的数据集如下所示,我想跳过class=4或2的class部分的最大索引后的2行。正如我们从数据集中可以看到的,4s有两个部分,我想在这两个部分中删除max index后的2行。还有,有一段2s,所以我想删除最大索引后的2行。然而,这只是一个例子,可能有4或2的多个部分。
------------------
| rate | class |
------------------
| 0.5 | 9 |
------------------
| 0.7 | 9 |
------------------
| 0.6 | 4 |
------------------
| 0.5 | 4 |
------------------
| 0.3 | 4 |
------------------
| 0.9 | 4 |
------------------
| 0.8 | 1 |
------------------
| 0.6 | 1 |
------------------
| 0.3 | 1 |
------------------
| 0.3 | 1 |
------------------
| 0.2 | 4 |
------------------
| 0.1 | 4 |
------------------
| 0.2 | 3 |
------------------
| 0.4 | 3 |
------------------
| 0.9 | 3 |
------------------
| 1.0 | 2 |
------------------
| 0.7 | 2 |
------------------
| 0.8 | 1 |
------------------
| 0.9 | 1 |
------------------
| 0.6 | 9 |
------------------
所需的输出如下所示:
------------------
| rate | class |
------------------
| 0.5 | 9 |
------------------
| 0.7 | 9 |
------------------
| 0.6 | 4 |
------------------
| 0.5 | 4 |
------------------
| 0.3 | 4 |
------------------
| 0.9 | 4 |
------------------
| 0.8 | 1 |
------------------
| 0.6 | 1 |
------------------
| 0.2 | 4 |
------------------
| 0.1 | 4 |
------------------
| 0.2 | 3 |
------------------
| 1.0 | 2 |
------------------
| 0.7 | 2 |
------------------
| 0.6 | 9 |
------------------
这是我的数据集的代码:
dd <- data.frame(rate = c(0.5,0.7,0.6,0.5,0.3,0.9,0.8,0.6,0.3,0.3,0.2,0.1,0.2,0.4,0.9,1.0,0.7,0.8,0.9,0.6),
class = c(9,9,4,4,4,4,1,1,1,1,4,4,3,3,3,2,2,1,1,9))
我真的很感谢你的时间和努力!
运行长度编码以查找每次运行2
或4
的终点,然后删除每个终点后的2行:
endpts <- with(rle(dd$class), cumsum(lengths)[values %in% c(2,4)] )
dd[-(endpts + rep(seq(2), each=length(endpts))),]
# rate class
#1 0.5 9
#2 0.7 9
#3 0.6 4
#4 0.5 4
#5 0.3 4
#6 0.9 4
#9 0.3 1
#10 0.3 1
#11 0.2 4
#12 0.1 4
#15 0.9 3
#16 1.0 2
#17 0.7 2
#20 0.6 9
library(dplyr)
dd %>%
filter(
!(class != 4 &
(
lag(class, n = 1, default = 0) == 4 |
lag(class, n = 2, default = 0) == 4
)
)
)
# rate class
# 1 0.5 9
# 2 0.7 9
# 3 0.6 4
# 4 0.5 4
# 5 0.3 4
# 6 0.9 4
# 7 0.3 1
# 8 0.3 1
# 9 0.2 4
# 10 0.1 4
# 11 0.9 3
# 12 1.0 2
# 13 0.7 2
# 14 0.8 1
# 15 0.9 1
# 16 0.6 9
我们过滤掉class
不是4 AND的行(前一行是4 OR,前一行第二行是4(。将滞后的默认值设置为不为4,这样第一行就不会被过滤掉。