【问题标题】:How to create monthly non-cumulative subtotals in R with dplyr?如何使用 dplyr 在 R 中创建每月非累积小计?
【发布时间】: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


【解决方案1】:

我们可能还需要在分组变量中使用year-month格式化的“日期”来为每个月重置

library(dplyr)
df %>%
  group_by(id, grp = format(date, "%Y-%m")) %>%
  mutate(total = cumsum(change)) %>%   
  ungroup() %>%
  fill(total, .direction = "down") %>%
  filter(id == 1) %>%
  ungroup %>%
  select(-grp)
# A tibble: 4 x 4
#  date          id change total
#  <date>     <dbl>  <dbl> <dbl>
#1 2010-01-01     1     NA    NA
#2 2010-02-01     1     NA     2
#3 2010-03-01     1     NA     9
#4 2010-04-01     1     NA    -4

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-11-24
    • 2021-10-11
    • 1970-01-01
    • 2018-11-08
    • 1970-01-01
    • 2013-05-03
    • 2022-01-17
    • 2012-10-17
    相关资源
    最近更新 更多