我想通过时间计算列中的汇总值(“ 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()
就会使它复杂化)
答案 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
创建年份总计列,并使用sum
和mutate
创建列来提供这些年份的累计金额。
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