【发布时间】:2019-09-14 01:27:38
【问题描述】:
我想为我的数据框 (df) 计算每月的非累积小计。
"date" "id" "change"
2010-01-01 1 NA
2010-01-07 2 3
2010-01-15 2 -1
2010-02-01 1 NA
2010-02-04 2 7
2010-02-22 2 -2
2010-02-26 2 4
2010-03-01 1 NA
2010-03-14 2 -4
2010-04-01 1 NA
新的时期从新月的第一天开始。 “id”列用作新周期开始 (==1) 和周期内观察 (==2) 的分组变量。目标是总结一个月内的所有变化,然后在 0 处重新开始下一个时期。输出应存储在 df 的附加列中。
这是我的数据框的可重现示例:
require(dplyr)
require(tidyr)
require(lubridate)
date <- ymd(c("2010-01-01","2010-01-07","2010-01-15","2010-02-01","2010-02-04","2010-02-22","2010-02-26","2010-03-01","2010-03-14","2010-04-01"))
df <- data.frame(date)
df$id <- as.numeric((c(1,2,2,1,2,2,2,1,2,1)))
df$change <- c(NA,3,-1,NA,7,-2,4,NA,-4,NA)
我试图做的事情:
df <- df %>%
group_by(id) %>%
mutate(total = cumsum(change)) %>%
ungroup() %>%
fill(total, .direction = "down") %>%
filter(id == 1)
导致这个输出:
"date" "id" "change" "total"
2010-01-01 1 NA NA
2010-02-01 1 NA 2
2010-03-01 1 NA 11
2010-04-01 1 NA 7
问题出在函数 cumsum 上,它从一个组中累积所有前面的值,并且不会在新的一段时间内从 0 重新开始。
所需的输出如下所示:
"date" "id" "change" "total"
2010-01-01 1 NA NA
2010-02-01 1 NA 2
2010-03-01 1 NA 9
2010-04-01 1 NA -4
“id”==1 的行显示了“id”==2 的所有先前列的更改总和,每个周期从 0 重新开始。是否存在针对此类问题的特定命令?谁能提供上述代码的更正替代方案?
【问题讨论】:
标签: r date group-by dplyr cumsum