[英]How to cumsum in R based on certain fields?
我為篇幅道歉,但為了不跳過細節並使這比現在更加混亂,這是必要的。
以下是我迄今為止所做的示例數據和一些操作。
library(dplyr)
library(tidyverse)
emp <- c(1,2,3,4,5,6,7,8,1,12,54,101,33,159,201,261,110,195,131,228)
small <- c(1,1,1,1,1,1,1,1,1,1,1,2,1,3,3,4,2,3,2,3)
area <-c(003,003,003,003,003,003,003,003,003,003,003,003,003,003,003,003,003,003,003,003)
twodigit <-c(11,22,11,22,23,22,11,31,44,45,21,44,45,62,72,22,45,72,45,21)
smbtest2 <- data.frame(emp,small,area,twodigit)
因此,在我走得太遠之前,目標是將就業(emp)按小(下圖)求和,然后將其分解為兩位數(行業代碼)。 在這個簡單的例子中,我想要每個小類別的前 3 個行業。 我正在嘗試 cumsum,因為如果一個屬於第一類(0 到 99),那么它將屬於第二類(0 到 149)。
smbsummary3<-smbtest2 %>%
group_by(area,small,twodigit) %>%
summarise(emp = sum(emp), worksites = n(),
.groups = 'drop_last')%>%
slice_max(emp,n=3)
smbsummary4<-smbsummary3 %>%
ungroup %>%
complete(area, small = unique(small)) %>%
fill(emp, worksites)
Schema for small
1 0 to 99
2 0 to 149
3 0 to 249
4 0 to 499
期望的結果
area small twodigit emp worksites
003 1 21 54 1
003 1 45 45 2 (12+33)
003 1 22 12 3 (2+4+6)
003 2 45 286 4 (12+33+110+131)
003 2 44 102 2 (1+101)
003 2 21 54 1
目前,它是純粹基於小求和,這是它應該基於代碼做的。 但是,我的問題是如何根據小類別將其變為cumsum(累計和)?
下面是我最近的嘗試。 它不加起來就是正確的答案,但我認為它接近正確的命令集。
smbsummary3<-smbtest2 %>%
group_by(area,small,twodigit) %>%
summarise(emp = sum(emp), worksites = n(),
.groups = 'drop_last')%>%
mutate(emp = cumsum(emp),
worksites = cumsum(worksites))%>%
slice_max(emp,n=3)
我打算在評論中解釋一下,但這似乎更容易。
也許您想在進行累積group_by
之前僅對area
和twodigit
進行分組。
然后, group_by
再次到 select 的前 3 個emp
值 by area
和small
。 生成的 output 看起來非常相似(在數據集中找不到small
2 和twodigit
21)。
smbtest2 %>%
group_by(area, small, twodigit) %>%
summarise(emp = sum(emp),
worksites = n(),
.groups = 'drop_last') %>%
group_by(area, twodigit) %>%
mutate(emp = cumsum(emp),
worksites = cumsum(worksites)) %>%
group_by(area, small) %>%
slice_max(emp, n = 3) %>%
arrange(area, small, desc(emp))
Output
area small twodigit emp worksites
<dbl> <dbl> <dbl> <dbl> <int>
1 3 1 21 54 1
2 3 1 45 45 2
3 3 1 22 12 3
4 3 2 45 286 4
5 3 2 44 102 2
6 3 3 72 396 2
7 3 3 21 282 2
8 3 3 62 159 1
9 3 4 22 273 4
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.