应对 NA 或条件的 R 分组计数器

R grouped counter that copes with NAs or conditions

我有一个 R 数据框,我需要一个计数器,它为一组新的情况提供一个新的数字,同时继续这个数字(尊重数据的顺序)。

之前有很多关于此的帖子,但 none 似乎可以解决我的问题。我试过使用 row_counteraverleid 的组合,none 似乎恰到好处。

id <- c("A","A","A","A","A","B","B","B","B","B","B","B","B","B","B","C","C","C","C","D","D")
marker_new <- c(1,0,0,0,0,1,0,1,0,0,0,0,1,0,1,1,0,1,0,1,0)
counter_result <- c(1,1,1,1,1,1,1,2,2,2,2,2,3,3,4,1,1,2,2,1,1)

df <- data.frame(id,marker_new, counter_result)

df <- df %>%
  group_by(id, marker_new) %>%
  mutate(counter = 
           ifelse(marker_new != 0,
                  row_number(),
                  lag(marker_new,lag(marker_new))) %>%
  ungroup()

我可以使用上面的代码达到目的,它会给我一个新的数字,但不会继续这组数字(就像我在 counter_result 中包含的那样)。

非常感谢任何帮助!

因为我们有 marker_new 列作为 1/0,我们可以使用 cumsum 按组 (id) 来获得计数器。

基数 R:

df$result <- with(df, ave(marker_new, id, FUN = cumsum))

dplyr:

df %>%  group_by(id) %>% mutate(result = cumsum(marker_new))

data.table

setDT(df)[, result := cumsum(marker_new), by = id]