【问题标题】:R grouped counter that copes with NAs or conditions [duplicate]应对NA或条件的R分组计数器[重复]
【发布时间】:2019-09-06 10:56:52
【问题描述】:

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

以前有很多关于此的帖子,但似乎没有一个可以解决我的问题。我尝试过使用row_counteraverleid 的组合,但似乎没有一个能成功。

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 一样)。

非常感谢任何帮助!

【问题讨论】:

  • cumsum by id 似乎给了counter_result, df %&gt;% group_by(id) %&gt;% mutate(counter_new = cumsum(marker_new))
  • @RonakShah 解决了!或者至少它让我意识到我的数据中有一个新问题......但回答了我的问题!不知道如何将评论标记为解决方案

标签: r dplyr counter


【解决方案1】:

由于我们将marker_new 列为1/0,因此我们可以按组(id)使用cumsum 来获取计数器。

基础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]

【讨论】:

    猜你喜欢
    • 2021-05-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-08-02
    • 2016-08-26
    • 2016-12-06
    • 2017-08-15
    • 1970-01-01
    相关资源
    最近更新 更多