根据分组和索引汇总一列中的值
Summarise values in one column based on grouping and index
我想根据索引和分组来汇总一个值。
这是我的玩具数据集:
vals<- 1:5
grps <- c(1,1,2,2,2)
dts <- as.Date(c("2020-01-01","2020-01-02","2020-01-03","2020-01-04","2020-01-05"))
dfx <- as_tibble(cbind(vals,grps,dts))
colnames(dfx) <- c("vals","grps","dts")
(rslt <- dfx %>%
mutate(dts = as.Date(dts)) %>%
arrange(dts) %>%
group_by(grps) %>%
mutate(dist = as.numeric(last(dts) - dts)))
生成的 df 如下所示:
vals grps dts dist
<dbl> <dbl> <date> <dbl>
1 1 1 2020-01-01 1
2 2 1 2020-01-02 0
3 3 2 2020-01-03 2
4 4 2 2020-01-04 1
5 5 2 2020-01-05 0
我想为每一行获取一个新变量(例如通过 mutate()),这是每个组内所有日期的摘要(grps ) 对于小于或等于索引中给出的值的每一行 (dist)。
换句话说,我想在某个截止日期之前获取每个每日间隔的值 (vals) 的摘要,同时合并分组。
所以我想要的最终结果将是我的 df 中的一列 (sum):
# A tibble: 5 x 5
# Groups: grps [2]
vals grps dts dist sum
<dbl> <dbl> <date> <dbl> <dbl>
1 1 1 2020-01-01 1 3
2 2 1 2020-01-02 0 2
3 3 2 2020-01-03 2 12
4 4 2 2020-01-04 1 9
5 5 2 2020-01-05 0 5
您可以 arrange
数据 dist
并为每个 grps
取 cumsum
。
library(dplyr)
rslt %>%
arrange(grps, dist) %>%
group_by(grps) %>%
mutate(sum = cumsum(vals))
# vals grps dts dist sum
# <dbl> <dbl> <date> <dbl> <dbl>
#1 2 1 2020-01-02 0 2
#2 1 1 2020-01-01 1 3
#3 5 2 2020-01-05 0 5
#4 4 2 2020-01-04 1 9
#5 3 2 2020-01-03 2 12
我想根据索引和分组来汇总一个值。 这是我的玩具数据集:
vals<- 1:5
grps <- c(1,1,2,2,2)
dts <- as.Date(c("2020-01-01","2020-01-02","2020-01-03","2020-01-04","2020-01-05"))
dfx <- as_tibble(cbind(vals,grps,dts))
colnames(dfx) <- c("vals","grps","dts")
(rslt <- dfx %>%
mutate(dts = as.Date(dts)) %>%
arrange(dts) %>%
group_by(grps) %>%
mutate(dist = as.numeric(last(dts) - dts)))
生成的 df 如下所示:
vals grps dts dist
<dbl> <dbl> <date> <dbl>
1 1 1 2020-01-01 1
2 2 1 2020-01-02 0
3 3 2 2020-01-03 2
4 4 2 2020-01-04 1
5 5 2 2020-01-05 0
我想为每一行获取一个新变量(例如通过 mutate()),这是每个组内所有日期的摘要(grps ) 对于小于或等于索引中给出的值的每一行 (dist)。 换句话说,我想在某个截止日期之前获取每个每日间隔的值 (vals) 的摘要,同时合并分组。
所以我想要的最终结果将是我的 df 中的一列 (sum):
# A tibble: 5 x 5
# Groups: grps [2]
vals grps dts dist sum
<dbl> <dbl> <date> <dbl> <dbl>
1 1 1 2020-01-01 1 3
2 2 1 2020-01-02 0 2
3 3 2 2020-01-03 2 12
4 4 2 2020-01-04 1 9
5 5 2 2020-01-05 0 5
您可以 arrange
数据 dist
并为每个 grps
取 cumsum
。
library(dplyr)
rslt %>%
arrange(grps, dist) %>%
group_by(grps) %>%
mutate(sum = cumsum(vals))
# vals grps dts dist sum
# <dbl> <dbl> <date> <dbl> <dbl>
#1 2 1 2020-01-02 0 2
#2 1 1 2020-01-01 1 3
#3 5 2 2020-01-05 0 5
#4 4 2 2020-01-04 1 9
#5 3 2 2020-01-03 2 12