使用dplyr和tidyverse汇总时间的总和

时间:2020-08-07 12:37:56

标签: r dplyr tidyverse

我想通过时间计算列中的汇总值(“ year”是数据中的另一列)。 我知道如何使用循环在base R中轻松地做到这一点,但我觉得必须有一种方法可以将dplyr与摘要结合使用来进行其他操作。我想学习一下,以便可以更好地集成到我的代码中。

我为同一案例制作了一个玩具示例。考虑一下这些数据,我们每年都有多少人在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()就会使它复杂化)

2 个答案:

答案 0 :(得分:3)

您可以使用<fieldType name="text_books_index" class="solr.TextField"> <analyzer type="index"> <tokenizer class="solr.StandardTokenizerFactory"/> <filter class="solr.StopFilterFactory" words="stopwords.txt" ignoreCase="true"/> <filter class="solr.LowerCaseFilterFactory"/> <filter class="solr.MorfologikFilterFactory"/> <filter class="solr.EdgeNGramFilterFactory" minGramSize="2" maxGramSize="15" /> </analyzer> <analyzer type="query"> <tokenizer class="solr.StandardTokenizerFactory"/> <filter class="solr.StopFilterFactory" words="stopwords.txt" ignoreCase="true"/> <filter class="solr.LowerCaseFilterFactory"/> <filter class="solr.MorfologikFilterFactory"/> </analyzer> </fieldType> summarise创建年份总计列,并使用summutate创建列来提供这些年份的累计金额。

cumsum

答案 1 :(得分: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
相关问题