按累计和分组
Group according to cumulative sums
我想按累计金额分组。在我的小例子中,列值中的前两个数字总和恰好为 100,属于 A 组。接下来的三个数字总和小于 100 并转到 B 组,而最后一个数字超过 100 并得到自己的组 C -等等。
input <- data.frame(id=c(1:6),
value =c(99, 1, 33, 33, 33, 150))
input
desired_output <- data.frame(id=c(1:6),
value =c(99, 1, 33, 33, 33, 150),
group= c("A", "A", "B", "B", "B", "C"))
desired_output
谢谢
desired_output <- data.frame(id=c(1:6),
value =c(99, 1, 33, 33, 33, 150),
group= c("A", "A", "B", "B", "B", "C"))
library(tidyverse)
desired_output %>%
group_by(grp_new = cumsum(value - 1) %/% 100) %>%
mutate(grp_new = LETTERS[cur_group_id()]) %>%
ungroup()
#> # A tibble: 6 x 4
#> id value group grp_new
#> <int> <dbl> <chr> <chr>
#> 1 1 99 A A
#> 2 2 1 A A
#> 3 3 33 B B
#> 4 4 33 B B
#> 5 5 33 B B
#> 6 6 150 C C
由 reprex package (v2.0.1)
于 2022-04-15 创建
两个可能的 one-liners,purrr::accumulate
和 MESS::cumsumbinning
:
purrr::accumulate
library(tidyverse)
group_by(input, grp = LETTERS[cumsum(value == accumulate(value, ~ ifelse(.x + .y <= 100, .x + .y, .y)))])
MESS::cumsumbinning
library(dplyr)
group_by(input, grp = LETTERS[MESS::cumsumbinning(value, 100)])
输出
# A tibble: 6 x 3
# Groups: grp [3]
id value grp
<int> <dbl> <chr>
1 1 99 A
2 2 1 A
3 3 33 B
4 4 33 B
5 5 33 B
6 6 150 C
我想按累计金额分组。在我的小例子中,列值中的前两个数字总和恰好为 100,属于 A 组。接下来的三个数字总和小于 100 并转到 B 组,而最后一个数字超过 100 并得到自己的组 C -等等。
input <- data.frame(id=c(1:6),
value =c(99, 1, 33, 33, 33, 150))
input
desired_output <- data.frame(id=c(1:6),
value =c(99, 1, 33, 33, 33, 150),
group= c("A", "A", "B", "B", "B", "C"))
desired_output
谢谢
desired_output <- data.frame(id=c(1:6),
value =c(99, 1, 33, 33, 33, 150),
group= c("A", "A", "B", "B", "B", "C"))
library(tidyverse)
desired_output %>%
group_by(grp_new = cumsum(value - 1) %/% 100) %>%
mutate(grp_new = LETTERS[cur_group_id()]) %>%
ungroup()
#> # A tibble: 6 x 4
#> id value group grp_new
#> <int> <dbl> <chr> <chr>
#> 1 1 99 A A
#> 2 2 1 A A
#> 3 3 33 B B
#> 4 4 33 B B
#> 5 5 33 B B
#> 6 6 150 C C
由 reprex package (v2.0.1)
于 2022-04-15 创建两个可能的 one-liners,purrr::accumulate
和 MESS::cumsumbinning
:
purrr::accumulate
library(tidyverse)
group_by(input, grp = LETTERS[cumsum(value == accumulate(value, ~ ifelse(.x + .y <= 100, .x + .y, .y)))])
MESS::cumsumbinning
library(dplyr)
group_by(input, grp = LETTERS[MESS::cumsumbinning(value, 100)])
输出
# A tibble: 6 x 3
# Groups: grp [3]
id value grp
<int> <dbl> <chr>
1 1 99 A
2 2 1 A
3 3 33 B
4 4 33 B
5 5 33 B
6 6 150 C