簡體   English   中英

如何根據某些字段在 R 中進行 cumsum?

[英]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之前僅對areatwodigit進行分組。

然后, group_by再次到 select 的前 3 個emp值 by areasmall 生成的 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM