将 case when 合并到 R 中的 cumsum 计算中的问题

Issues with combining a case when into a cumsum calculation in R

下面是样本数据和我的尝试。我的主要问题是当源数据中不存在 small = 2、3 或 4 的值时,如何让 smbsummary3 数据框显示这些值。我的总结部分计算正确。我是否需要在总结之前添加 case_when 语句或将缺少 2、3、4 视为 NA?

emp <- c(1,2,3,4,5,6,7,8,1,12,54,101,33,159,201,261)
small <- c(1,1,1,1,1,1,1,1,1,1,1,2,1,3,3,4)
area <-c(001,001,001,001,001,001,001,001,003,003,003,003,003,003,003,003)

smbtest2 <- data.frame(emp,small,area)

 smbtest2 <- smbtest2 %>% mutate(smb = case_when(emp >=0 & emp <100 ~ "1",emp >=0 & emp <150 ~ "2",emp >=0 & emp <250 ~ "3", emp >=0 & emp <500 ~ "4",emp >=0 & emp <1000000 ~ "Total"))

smbsummary3<-smbtest2 %>% 
group_by(area,small) %>%
summarise(emp = sum(emp), worksites = n(), 
        .groups = 'drop_last') %>% 
mutate(emp = cumsum(emp),
     worksites = cumsum(worksites)) 

小变量的架构。

  Emp               smb
  0 to 100           1
  0 to 150           2
  0 to 250           3
  0 to 500           4

想要的结果

  area       small    emp   worksites
  001          1       36      8
  001          2       36      8
  001          3       36      8
  001          4       36      8
  003          1       100     4
  003          2       201     5
  003          3       561     7
  003          4       822     8

如果我们需要缺失的组合,请执行 complete

library(dplyr)
library(tidyr)
smbsummary3 %>% 
    ungroup %>% 
    complete(area, small = unique(small)) %>% 
    fill(emp, worksites)

-输出

# A tibble: 8 x 4
#   area small   emp worksites
#  <dbl> <dbl> <dbl>     <int>
#1     1     1    36         8
#2     1     2    36         8
#3     1     3    36         8
#4     1     4    36         8
#5     3     1   100         4
#6     3     2   201         5
#7     3     3   561         7
#8     3     4   822         8

这是一个使用左连接和 nafill

data.table 选项
setDT(smbsummary3)[
  smbsummary3[, .SD[, unique(smbsummary3[, .(small)])], area],
  on = .(area, small)
][
  ,
  lapply(.SD, nafill, type = "locf")
]

这给出了

   area small emp worksites
1:    1     1  36         8
2:    1     2  36         8
3:    1     3  36         8
4:    1     4  36         8
5:    3     1 100         4
6:    3     2 201         5
7:    3     3 561         7
8:    3     4 822         8