R 中的 cumsum 问题

问题描述

这里是示例数据和包。我正在使用的代码如下。它适用于前四行,但之后就出错了。想要的结果在最底层。我需要 cumsum 只查看面积、周期组合... 001 和 2020q1。在这种情况下,将有 4 个分组(001/2020q1、003/2020q1、001/2020q2、003/2020q2)。我将如何进行这样的过程?我有一种感觉,我在 group by 子句中遗漏了一些东西,但到目前为止还在循环。

这是上一个问题的延续。这有更多的数据,涉及的也更多。

 library(readxl)
 library(dplyr)
 library(data.table)
 library(odbc)
 library(DBI)
 library(stringr)

employment <- c(1,45,125,130,165,260,2,46,127,132,167,265,50,61,110,121,170,305,55,66,112,123,172,310)
small <- c(1,1,3,4,4)
area <-c(001,001,003,003)
year<-c(2020,2020,2020)
qtr <-c(1,2)

smbtest <- data.frame(employment,small,area,year,qtr)


 smbsummary2<-smbtest %>% 
 mutate(period = paste0(year,"q",qtr)) %>%
 select(area,period,employment,small) %>%
 group_by(area,small) %>%
 summarise(employment = sum(employment),worksites = n(),.groups = 'drop') %>% 
 mutate(employment = cumsum(employment),worksites = cumsum(worksites))


area    period     small    employment    worksites
 001     2020q1     1          46            2
 001     2020q1     2          303           4
 001     2020q1     3          466           5
 001     2020q1     4          726           6
 003     2020q1     1          48            2
 003     2020q1     2          307           4
 003     2020q1     3          474           5
 003     2020q1     4          739           6
 001     2020q2     1          111           2
 001     2020q2     2          342           4
 001     2020q2     3          512           5
 001     2020q1     4          817           6
 and so on. 

解决方法

.groups = 'drop' 删除所有组,而我们需要 .groups = 'drop_last'。根据显示的预期输出,应该删除“小”列。默认情况下,summarise 会执行 .groups = 'drop_last,如果我们想指定它来删除警告,则可以这样做

smbsummary2 <- smbtest %>% 
 mutate(period = paste0(year,"q",qtr)) %>%
 select(area,period,employment,small) %>%
 group_by(area,small) %>%
 summarise(employment = sum(employment),worksites = n(),.groups = 'drop_last') %>%  mutate(employment = cumsum(employment),worksites = cumsum(worksites))