dplyr 覆盖组中除了第一次出现的值之外的所有值

rpl*_*rpl 5 r dplyr

我有一个分组的 data_frame,其中“标签”列采用值“0”和“1”。在每组中,我需要找到第一个出现的“1”并将所有剩余的出现更改为“0”。有没有办法在 dplyr 中实现它?

例如,让我们采用“iris”数据并添加额外的“tag”列:

data(iris)
set.seed(1)
iris$tag <- sample( c(0, 1), 150, replace = TRUE, prob = c(0.8, 0.2))
giris <- iris %>% group_by(Species)
Run Code Online (Sandbox Code Playgroud)

在“giris”中,在“setosa”组中,我只需要保留第一次出现的“1”(即在第4行)并将其余的设置为“0”。这看起来有点像敷面膜什么的……

有办法做到吗?我一直在尝试“哪个”和“重复”,但没有成功。我一直在考虑只过滤“1”,保留它们,然后与剩余的集合连接,但这似乎很尴尬,特别是对于 12GB 的数据集。

tal*_*lat 3

dplyr 选项:

mutate(giris, newcol = as.integer(tag & cumsum(tag) == 1))
Run Code Online (Sandbox Code Playgroud)

或者

mutate(giris, newcol = as.integer(tag & !duplicated(tag)))
Run Code Online (Sandbox Code Playgroud)

或者使用 data.table,相同的方法,但通过引用进行修改:

library(data.table)
setDT(giris)
giris[, newcol := as.integer(tag & cumsum(tag) == 1), by = Species]
Run Code Online (Sandbox Code Playgroud)