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 中存在表,则从表中删除行,否则忽略删除
如果numpy数组的所有元素都等于某个值,则从numpy数组中删除行/列