【问题标题】:Aggregated sum through time using dplyr and the tidyverse [duplicate]使用 dplyr 和 tidyverse 的时间汇总总和 [重复]
【发布时间】:2020-08-07 12:37:56
【问题描述】:

我想通过时间计算列中的聚合值(“年”是我数据中的另一列。 我知道如何在 base R 中使用循环轻松地做到这一点,但我觉得必须有一种方法可以对 dplyr 使用 summarise 和其他东西来做同样的事情。我想了解这一点,这样我可以更好地将 if 集成到我的代码中。

我为同一案例制作了一个玩具示例。考虑一下这个数据,其中我们有每年有人在 Stackoverflow 中提出的问题数量。

> library(tidyverse)
> data <- tribble(~year, ~questions,
                2015,  1,
                2016,  3,
                2016,  2,
                2017,  2,
                2018,  3,
                2018,  7,
                2019, 10,
                2020, 21)
> data
# A tibble: 6 x 2
   year questions
  <dbl>     <dbl>
1  2015         1
2  2016         3
3  2016         2
4  2017         2
5  2018         3
6  2018         7
7  2019        10
8  2020        21

下面的循环会做我想做的事

> for (i in 1:length(data$year)){
+   data$agg_questions[i] <- sum(data$questions[data$year <= data$year[I]])
+ }
> data
# A tibble: 6 x 3
   year questions agg_questions
  <dbl>     <dbl>         <dbl>
1  2015         1             1
2  2016         5             6
3  2017         2             8
4  2018        10            18
5  2019        10            28
6  2020        21            49

当然,我正在寻找一种不使用循环的方法。不是这样的:

> for (i in 1:length(data$year)){
+   data$agg_questions2[i] <- data %>% 
+   filter(year <= data$year[i]) %>% 
+   pull(questions) %>% 
+   sum()
+ } 
> data
# A tibble: 6 x 4
   year questions agg_questions agg_questions2
  <dbl>     <dbl>         <dbl>          <dbl>
1  2015         1             1              1
2  2016         5             6              6
3  2017         2             8              8
4  2018        10            18             18
5  2019        10            28             28
6  2020        21            49             49

我知道是否可以在 summarise() 和 mutate() 函数中使用 [] 来设置子集,但我一直在为此苦苦挣扎。谢谢! 这可能吗?


编辑

阅读第一个答案后,我意识到我将示例简化得太多了。我通过添加同一年的几行来编辑示例数据,使其看起来更像我想要的(而且,我认为,仅使用 cumsum() 会变得复杂)

【问题讨论】:

  • data %&gt;% arrange(year) %&gt;% mutate(questions = cumsum(questions))

标签: r dplyr tidyverse


【解决方案1】:

您可以通过使用summarisesum 创建一个年份总计列并使用mutatecumsum 创建一个提供历年累积总和的列来实现此目的。

library(dplyr)

data <- tribble(~year, ~questions,
                2015,  1,
                2016,  3,
                2016,  2,
                2017,  2,
                2018,  3,
                2018,  7,
                2019, 10,
                2020, 21)

data %>%     
  group_by(year) %>%     
  summarise(year_total = sum(questions)) %>%    
  mutate(cum_over_years = cumsum(year_total))

#> # A tibble: 6 x 3
#>    year year_total cum_over_years
#>   <dbl>      <dbl>          <dbl>
#> 1  2015          1              1
#> 2  2016          5              6
#> 3  2017          2              8
#> 4  2018         10             18
#> 5  2019         10             28
#> 6  2020         21             49

【讨论】:

  • 感谢@eric-fletcher 的回答,但这让我意识到这个例子太简单了,每年只有一行。我想申请更复杂的案例。我将编辑和更新示例
  • 他们关闭了您的问题,但只是在 Eric 的答案中添加了一行。 data %&gt;% group_by(year) %&gt;% summarise(year_total = sum(questions)) %&gt;% mutate(cum_over_years = cumsum(year_total))
  • 谢谢 Chuck P。我已经更新了我的答案。
  • 谢谢,既有用又简单!我要补充一点,在实际情况下,在使用cumsum() 之前确保您按year 安排可能是值得的。这是我的担心,cumsum() 只是对所有先前的行求和,但不控制基于另一列的顺序。我一直在寻找一个能够做到这一点的函数(sum + 考虑第二列给出命令),但使用summarise + arrange + mutate(cumsum()) 到达那里是有意义的。 data %&gt;% group_by(year) %&gt;% summarise(year_total = sum(questions)) %&gt;% arrange(year) %&gt;% mutate(cum_over_years = cumsum(year_total))
【解决方案2】:
library(tibble)

data <- tribble(~year, ~questions,
                2015,  1,
                2016,  3,
                2017,  2,
                2018,  3,
                2019, 10,
                2020, 21)

在基础 R 中:

data <- as.data.frame(data)
data$agg_questions <- cumsum(data$questions) 

> data
  year questions agg_questions
1 2015         1             1
2 2016         3             4
3 2017         2             6
4 2018         3             9
5 2019        10            19
6 2020        21            40

在data.table中:

library(data.table)    
data <- as.data.table(data)
data[, agg_questions := cumsum(questions)]

> data
   year questions agg_questions
1: 2015         1             1
2: 2016         3             4
3: 2017         2             6
4: 2018         3             9
5: 2019        10            19
6: 2020        21            40

【讨论】:

    猜你喜欢
    • 2017-05-31
    • 2021-01-20
    • 2019-01-25
    • 2018-07-25
    • 1970-01-01
    • 2018-05-15
    • 1970-01-01
    • 2018-04-23
    • 2020-08-23
    相关资源
    最近更新 更多