a <- c("A","A","A","B","B","B","C","C","C","C","D","D","D","D","D")
b <- c("x","y","z","x","x","z","y","z","z","z","y","z","z","z","x")
df = data.frame(a,b)


    a   b
1   A   x
2   A   y
3   A   z
4   B   x
5   B   x
6   B   z
7   C   y
8   C   z
9   C   z
10  C   z
11  D   y
12  D   z
13  D   z
14  D   z
15  D   x

对于每个组 A、B、C、D,每次组合 y,z 出现在组末尾时,我都想删除 b 列中的值 z。

如果我们有 a=="C"的情况,其中 b 值是 y,z,z,z,我想删除所有 z。但是,在 a=="D"中,x 是最后一个值,因此无需更改任何内容。

结果如下所示:
    a   b
1   A   x
2   A   y
4   B   x
5   B   x
6   B   z
7   C   y
11  D   y
12  D   z
13  D   z
14  D   z
15  D   x

通过在 dplyr 中分组,我可以识别 A 中每个值的最后一次出现,因此 a=="A" 中描述的基本情况不是问题。对于 a=="C" 的情况,我很难找到解决方案,在这种情况下,我可以出现 y 一次,然后出现 20 次 z。

最佳答案

您可以在基础 R 中使用 bycummin:

df[unlist(by(df$b, interaction(df$a), FUN = function(x) {
  tmp <- rev(cummin(rev(x == "z")))
  if (tail(x[!tmp], 1) == "y") !tmp else rep(TRUE, length(x))
})), ]

结果:
   a b
1  A x
2  A y
4  B x
5  B x
6  B z
7  C y
11 D y
12 D z
13 D z
14 D z
15 D x

10-07 19:59
查看更多