将 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
下面是样本数据和我的尝试。我的主要问题是当源数据中不存在 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