我最近在寻找有关如何使用 dplyr ( dplyr override all but the first occurrences of a value within a group ) 抑制组中除第一次出现之外的所有值的建议。

解决方案是一个非常聪明的解决方案,现在我正在努力寻找同样有效的方法,以防我只需要抑制 n 个下一个值。

例如,在下面的代码中,我创建了一个新的“标签”列:

library('dplyr')
data(iris)
set.seed(1)
iris$tag <- sample(c(0,1), 150, replace=TRUE, prob = c(0.7, 0.3))
giris <- iris %>% group_by(Species)

# Source: local data frame [150 x 6]
# Groups: Species [3]
#
#    Sepal.Length Sepal.Width Petal.Length Petal.Width Species   tag
#           (dbl)       (dbl)        (dbl)       (dbl)  (fctr) (dbl)
# 1           5.1         3.5          1.4         0.2  setosa     0
# 2           4.9         3.0          1.4         0.2  setosa     0
# 3           4.7         3.2          1.3         0.2  setosa     0
# 4           4.6         3.1          1.5         0.2  setosa     1
# 5           5.0         3.6          1.4         0.2  setosa     0
# 6           5.4         3.9          1.7         0.4  setosa     1
# 7           4.6         3.4          1.4         0.3  setosa     1
# 8           5.0         3.4          1.5         0.2  setosa     0
# 9           4.4         2.9          1.4         0.2  setosa     0
# 10          4.9         3.1          1.5         0.1  setosa     0
# ..          ...         ...          ...         ...     ...   ...

在 setosa 组行中:4, 6, 7, ... 被标记为“1”。在出现“1”之后,我试图在接下来的两行中抑制“1”(即将它们转换为“0”)。换句话说,行#5 和#6 应设置为“0”,但#7 应保持不受影响。在这种情况下,第 7 行恰好是“1”,因此第 8 行和第 9 行应设置为“0”,依此类推……

有关如何在 dplyr 中执行此操作的任何提示?这个包真的很强大,但出于某种原因,掌握所有微妙之处对我来说是一种精神上的挑战......

还有一些例子:
在以下情况下:0 0 1 1,输出应为 0 0 1 0
在以下情况下:0 0 1 1 1 1 1,输出应为 0 0 1 0 0 1 0

最佳答案

对我来说,如果您使用累积减少来跟踪折射周期,这在语义上会更清晰。

suppress <- function(x, w) {
  r <- Reduce(function(d,i) if(i&!d) w else max(0,d-1), x, init=0, acc=TRUE)[-1]
  x * (r==w)
}

例子
suppress(c(0,0,1,1,1,1,1), 2)
#>     [1] 0 0 1 0 0 1 0

关于r - dplyr 抑制组中某个值的下 n 次出现,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/36088920/

10-12 19:11