r - 如果下面的行包含一个值,则从计数中删除

Posted

技术标签:

【中文标题】r - 如果下面的行包含一个值,则从计数中删除【英文标题】:r - remove from count if row below is contains a value 【发布时间】: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() 可能会有所帮助。 【参考方案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))

【讨论】:

以上是关于r - 如果下面的行包含一个值,则从计数中删除的主要内容,如果未能解决你的问题,请参考以下文章

如果 Redshift 中存在表,则从表中删除行,否则忽略删除

如果两个值匹配,则从 php 中的多维关联数组中删除重复项

如果numpy数组的所有元素都等于某个值,则从numpy数组中删除行/列

如果重复 x 次,则从数组中删除值 | JavaScript

如果行只包含停用词中的任何一行,则从文本文件中删除这些行

如果a列中有值,则VBA复制/粘贴范围为下面的行