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 中使用 by
和 cummin
:
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