【问题标题】:r - remove from count if row below is contains a valuer - 如果下面的行包含一个值,则从计数中删除
【发布时间】:2021-11-05 09:40:42
【问题描述】:

我正在尝试根据滚动计数汇总信息。但是,在某些情况下,我不想在聚合行中包含基于它后面的行的行。

例如,我希望下面的聚合为 14 而不是 11。类型字段表示不应包含上面的行。

data.frame(id = rep(123, 7),
           type = c(rep("d", 3), "c", rep("d", 3)),
           value = c(2, 4, 2, -2, 3, 5, 2)) %>% 
  group_by(id, type) %>% 
  mutate(count = seq(n()),
         count = ifelse(type == "c", count * -1, count)) %>% 
  ungroup() %>% 
  mutate(sum_field = case_when(count <= 4 & count >= 1 ~ value),
         sum_should_be = c(2, 4, NA, NA, 3, 5, NA)) %>% 
  group_by(id) %>% 
  summarise(current = sum(sum_field, na.rm = T),
            desired = sum(sum_should_be, na.rm = T))

【问题讨论】:

  • 请提供可重现的示例dput() 可能会有所帮助。

标签: r dplyr group-by


【解决方案1】:

我建议使用前导变量。为了与您的代码保持一致:

data.frame(id = rep(123,7), 
                type = c(rep('d', 3), 'c', rep('d',3)), 
                value = c(2,4,2,-2,3,5,2)) %>%
   mutate(lead_type = lead(type,1)) %>% 
   group_by(id, type, lead_type) %>% 
   mutate(count = seq(n()), 
          count = ifelse(type == 'd' & lead_type == 'd', count, 0)) %>%
   ungroup() %>% 
   mutate(sum_field = case_when(count <= 4 & count >= 1 ~ value)) %>% 
   group_by(id) %>% 
   summarise(current = sum(sum_field, na.rm = T))

【讨论】:

    猜你喜欢
    • 2022-01-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-08-18
    • 2012-11-07
    • 1970-01-01
    相关资源
    最近更新 更多