【问题标题】:How to cumsum in R based on certain fields?如何根据某些字段在 R 中求和?
【发布时间】:2021-05-18 17:30:36
【问题描述】:

我为篇幅道歉,但为了不跳过细节并使这比现在更混乱,这是必要的。

下面是样本数据和我目前所做的一些操作。

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

目前,它是纯粹基于small来求和的,这是它应该基于代码做的。但是,我的问题是如何根据小类别将其变为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)

【问题讨论】:

    标签: r dplyr cumsum


    【解决方案1】:

    我打算在评论中解释一下,但这似乎更容易。

    也许你想group_by 只是areatwodigit 在做你的累积和之前。

    然后,再次group_by 以通过areasmall 选择前3 个emp 值。结果输出看起来非常相似(在数据集中找不到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))
    

    输出

       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
    

    【讨论】:

      猜你喜欢
      • 2021-03-27
      • 2020-09-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-23
      • 2021-03-17
      • 2019-10-18
      • 1970-01-01
      相关资源
      最近更新 更多