R:计算每月和按组的累计总和

问题描述 投票:0回答:1

我首先通过使用 group-by 和 mutate 计算组内的 ID 来计算每月总和。但是,当我尝试使用 cumsum 按组计算每月累计总和时,数据看起来不正确。如果有人能帮助我,那将非常有帮助。谢谢~

假设原始数据框如下所示:

人员编号 公司 yyyy
1 A 2011 一月
2 A 2011 一月
3 A 2011 二月
4 A 2011 二月
5 A 2011 二月
6 A 2011 三月
7 B 2011 一月
8 B 2011 一月
9 B 2011 一月
10 B 2011 二月
11 B 2011 二月
12 B 2011 二月
13 B 2011 二月
14 B 2011 三月
15 B 2011 三月
16 B 2011 四月

我想要一个最终输出数据框,如下所示。

人员编号 公司 yyyy 每月金额 每月累计金额
1 A 2011 一月 2 2
2 A 2011 一月 2 2
3 A 2011 二月 3 5
4 A 2011 二月 3 5
5 A 2011 二月 3 5
6 A 2011 三月 1 6
7 B 2011 一月 3 3
8 B 2011 一月 3 3
9 B 2011 一月 3 3
10 B 2011 二月 4 7
11 B 2011 二月 4 7
12 B 2011 二月 4 7
13 B 2011 二月 4 7
14 B 2011 三月 2 9
15 B 2011 三月 2 9
16 B 2011 四月 1 10
r dataframe group-by cumulative-sum
1个回答
0
投票
library(dplyr, warn.conflicts = F)


df1 %>% 
  summarise(monthly_sum = n_distinct(person_id), .by = c(company, yyyy, month)) %>% 
  mutate(cumulative_sum = cumsum(monthly_sum), .by = company) %>% 
  right_join(df1, .)
#> Joining with `by = join_by(company, yyyy, month)`

#>    person_id company yyyy    month monthly_sum cumulative_sum
#> 1          1       A 2011  January           2              2
#> 2          2       A 2011  January           2              2
#> 3          3       A 2011 Feburary           3              5
#> 4          4       A 2011 Feburary           3              5
#> 5          5       A 2011 Feburary           3              5
#> 6          6       A 2011    March           1              6
#> 7          7       B 2011  January           3              3
#> 8          8       B 2011  January           3              3
#> 9          9       B 2011  January           3              3
#> 10        10       B 2011 Feburary           4              7
#> 11        11       B 2011 Feburary           4              7
#> 12        12       B 2011 Feburary           4              7
#> 13        13       B 2011 Feburary           4              7
#> 14        14       B 2011    March           2              9
#> 15        15       B 2011    March           2              9
#> 16        16       B 2011    April           1             10

数据:

read.table(text= "person_id     company     yyyy    month
1   A   2011    January
2   A   2011    January
3   A   2011    Feburary
4   A   2011    Feburary
5   A   2011    Feburary
6   A   2011    March
7   B   2011    January
8   B   2011    January
9   B   2011    January
10  B   2011    Feburary
11  B   2011    Feburary
12  B   2011    Feburary
13  B   2011    Feburary
14  B   2011    March
15  B   2011    March
16  B   2011    April", header = T, stringsAsFactors = F) -> df1

创建于 2024-04-29,使用 reprex v2.0.2

© www.soinside.com 2019 - 2024. All rights reserved.