问题描述
这里是示例数据和包。我正在使用的代码如下。它适用于前四行,但之后就出错了。想要的结果在最底层。我需要 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))