如何在R中的最大索引后跳过一定数量的行

  • 本文关键字:索引 r
  • 更新时间 :
  • 英文 :


我试图在每个类部分的最大索引之后跳过一定数量的行。我的数据集如下所示,我想跳过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))

我真的很感谢你的时间和努力!

运行长度编码以查找每次运行24的终点,然后删除每个终点后的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,这样第一行就不会被过滤掉。

最新更新