【发布时间】: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 %>% arrange(year) %>% mutate(questions = cumsum(questions))