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

时间:2016-03-18 08:19:47

标签: r dplyr which

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

例如,让我们使用“iris”数据,然后添加额外的“标记”列:

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)

在“giris”中,在“setosa”组中,我只需保留第一次出现的“1”(即第4行),并将其余的设置为“0”。这看起来有点像应用面具或其他东西......

有办法吗?我一直在尝试“哪个”和“重复”,但我没有成功。我一直在考虑过滤“1”,保留它们,然后加入其余的设置,但这看起来很尴尬,特别是对于12GB的数据集。

提前致谢!

2 个答案:

答案 0 :(得分:2)

我们可以尝试

res <- giris %>%
         group_by(Species) %>% 
         mutate(tag1 = ifelse(cumsum(c(TRUE,diff(tag)<0))!=1, 0, tag))

table(res[c("Species", "tag1")])
#            tag1
#Species      0  1
# setosa     49  1
# versicolor 49  1
# virginica  49  1

答案 1 :(得分:2)

dplyr选项:

mutate(giris, newcol = as.integer(tag & cumsum(tag) == 1))

mutate(giris, newcol = as.integer(tag & !duplicated(tag)))

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

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